DLL的兩種載入方式
阿新 • • 發佈:2019-01-24
DLL有兩種呼叫方式
一,隱式載入(需要.lib和.dll)
二,顯式載入(需要.dll)
DLL隱式載入
隱式載入就是在程式編譯的時候就將dll編譯到可執行檔案中,這種載入方式呼叫方便,程式釋出的時候可以不用講dll帶著.缺點是,這樣編譯出來後,程式會很大
新建一個簡單的工程,將dllDemo.lib和dllDemo.dll複製到debug同目錄(工程根目錄)下(因為用VC執行程式時程式的工作目錄是這個工程的根目錄,而單獨執行程式的時候,工作目錄是程式所在目錄),測試程式碼如下:
#include <stdio.h>
//隱式載入dll
#pragma comment(lib, "dllDemo.lib")
//宣告外部函式
extern void exportSwap(int *piA, int *piB);
int main(void)
{
int a = 3;
int b = 2;
printf("a = %d, b = %d\n", a, b);
exportSwap(&a,&b); //直接呼叫
printf("a = %d, b = %d\n", a, b);
return 0;
}
程式執行結果 :
可以看到程式在一開始就載入了dll,然後成功呼叫dll裡的函式
DLL顯式載入
DLL顯式載入時指在程式執行過程中,需要用到dll裡的函式時,再動態載入dll到記憶體中,這種載入方式因為是在程式執行後再載入的,所以可以讓程式啟動更快,而且dll的維護更容易,使得程式如果需要更新,很多時候直接更新dll,而不用重新安裝程式.只是這種載入方式,函式呼叫稍微複雜一點
同樣上面那個工程,將程式碼稍微改一下
#include <stdio.h>
#include <windows.h>
//定義一個指向空的函式指標
typedef void (* DLLDEMOFUNC)(void);
int main(void)
{
int a = 3;
int b = 2;
DLLDEMOFUNC dllFunc = NULL;
HINSTANCE hDll;
printf("a = %d, b = %d\n", a, b);
//動態載入dll
hDll = LoadLibrary("dllDemo.dll" );
//根據函式名獲取dll地址
dllFunc = (DLLDEMOFUNC)GetProcAddress(hDll, "exportSwap");
//呼叫dll的匯出函式
dllFunc(&a, &b);
printf("a = %d, b = %d\n", a, b);
//解除安裝dll
FreeLibrary(hDll);
return 0;
}
程式執行結果
可以看到,dll是在執行過程中載入的,成功呼叫了dll中的函式
到此為止,dll的兩種載入方式就講完了,有的人可能會出現函式匯出名不是原來的函式名的問題,那應該是dll編寫的時候用的cpp檔案,所以vc用的c++語法去編譯的原因..我測試的程式碼用的都是c檔案