dll的動態載入

2021-06-11 07:39:55 字數 1312 閱讀 1766

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...