1. 程式人生 > >DLL的兩種載入方式

DLL的兩種載入方式

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檔案