dll的載入方式有兩種:隱式鏈結和動態載入。隱式鏈結,需要包含標頭檔案,引用.lib檔案才能使用匯出函式。動態載入,直接使用loadlibrary載入所需的動態庫,然後指定所需的匯出函式。一般情況下,兩種方式都是可行的。如果我們沒有標頭檔案和.lib檔案,只有dll,使用第二種方法是比較通用的作法。舉例如下:
現有test.dll,有如下一些匯出函式:
void func1(int a,int b);
int func2(int a,double b);
int func3(int* a,int* b);
//載入dll
hinstance dllhinstance = loadlibraryex(dllfullname, null, load_with_altered_search_path);
//dllfullname為包含路徑的dll名稱
//定義函式指標型別
typedef void(__stdcall *proc1)(int,int);
typedef int(__stdcall *proc2)(int,double);
typedef int(__stdcall *proc3)(void*,int);//對於不能確定型別的指標用void*代替
//宣告函式指標型別變數
proc1 myproc1;
proc2 myproc2;
proc3 myproc3;
//獲取函式指標存入對應變數
myproc1 = (proc1) getprocaddress(dllhinstance, "func1");
myproc2 = (proc2) getprocaddress(dllhinstance, "func2");
myproc3 = (proc3) getprocaddress(dllhinstance, "func3");
int a = 10;
int b = 5;
// 呼叫func1
(*myproc1)(a,b);
// 呼叫func2
int c = (*myproc2)(a,(double)b);
// 呼叫func3
c = (*myproc3)(&a,&b);
//呼叫完畢解除安裝dll
freelibrary(dllhinstance);
如果匯出函式個數較多,或者匯出函式被多次呼叫的情況下,可以構造標頭檔案,通過巨集的展開獲取函式指標。如果dll被多次呼叫的話,伴隨著巨集多次展開的時間開銷是乙個不可忽略的因數。另外可借助專門工具對應生成.lib檔案,採用隱式鏈結的方式載入。 如上所述,兩種方法各有優劣,根據實際情況合理取捨。
動態載入dll
利用反射進行動態載入和呼叫.assemblyass assembly.loadfrom dllpath 利用dll的路徑載入 載入dll後,需要使用dll中某類.type type ass.gettype typename 利用型別的命名空間和名稱獲得型別 需要例項化型別,才可以使用,引數可以人為的...
dll的動態載入
所謂動態載入就是在程式執行時進行載入,能否呼叫dll中的方法,只有在程式執行的時候才能知道。qt提供qlibrary類提供動態載入。示例 匯出的函式 int dlladd int num,int num 2 動態載入 typedef int addfunction int,int 定義函式指標,引數...
靜態載入dll和動態載入dll
一,首先編寫dll 建win32空dll工程 標頭檔案.h extern c declspec dllexport int max int a,int b extern c 解決函式名由於不同編譯器造成的名字匹配問題,通常c 編譯器編譯時會對函式進行改名,而c編譯器不會 extern c decls...