1. 程式人生 > >VC中使用動態連結庫DLL:靜態呼叫和動態呼叫

VC中使用動態連結庫DLL:靜態呼叫和動態呼叫

VC中生成DLL的辦法見:
www.codeproject.com/KB/DLL/RegDLL.aspx

VC中使用DLL
http://www.cnblogs.com/c1230v/articles/1401448.html

呼叫DLL有兩種方法:靜態呼叫和動態呼叫.
(一).靜態呼叫其步驟如下:
1.把你的youApp.DLL拷到你目標工程(需呼叫youApp.DLL的工程)的Debug目錄下;
2.把你的youApp.lib拷到你目標工程(需呼叫youApp.DLL的工程)目錄下;
3.把你的youApp.h(包含輸出函式的定義)拷到你目標工程(需呼叫youApp.DLL的工程)目錄下;
4.開啟你的目標工程選中工程,選擇Visual C++的Project主選單的Settings選單;
5.執行第4步後,VC將會彈出一個對話方塊,在對話方塊的多頁顯示控制元件中選擇Link頁。然後在Object/library modules輸入框中輸入:youApp.lib
6.選擇你的目標工程Head Files加入:youApp.h檔案;
7.最後在你目標工程(*.cpp,需要呼叫DLL中的函式)中包含你的:#include "youApp.h"
注:youApp是你DLL的工程名。

(二).動態呼叫其程式如下:
動態呼叫時只需做靜態呼叫步驟1.

{
    HINSTANCEhDllInst=LoadLibrary("youApp.DLL");
    if(hDllInst)
    {
        typedefDWORD (WINAPI*MYFUNC)(DWORD,DWORD);
        MYFUNCyouFuntionNameAlias=NULL;
        // youFuntionNameAlias 函式別名
        youFuntionNameAlias= (MYFUNC)GetProcAddress(hDllInst,"youFuntionName");
        // youFuntionName 在DLL中宣告的函式名
        if(youFuntionNameAlias)
        {
            youFuntionNameAlias(param1,param2);
        }
        FreeLibrary(hDllInst);
    }
}
顯式(靜態)呼叫:
LIB + DLL + .H,注意.H中dllexport改為dllimport
隱式(動態)呼叫:
DLL + 函式原型宣告,先LoadLibrary,再GetProcAddress(即找到DLL中函式的地址),不用後FreeLibrary

--------------------------------------
動態連結庫DLL的連結
http://blog.donews.com/mmycly/archive/2006/06/15/917076.aspx

應用程式使用DLL可以採用兩種方式:一種是隱式連結,另一種是顯式連結。在使用DLL之前首先要知道DLL中函式的結構資訊。Visual C++6.0在VC\bin目錄下提供了一個名為Dumpbin.exe的小程式,用它可以檢視DLL檔案中的函式結構。另外,Windows系統將遵循下面的搜尋順序來定位DLL: 1.包含EXE檔案的目錄,2.程序的當前工作目錄, 3.Windows系統目錄, 4.Windows目錄,5.列在Path環境變數中的一系列目錄。

(一).隱式連結
隱式連結就是在程式開始執行時就將DLL檔案載入到應用程式當中。實現隱式連結很容易,只要將匯入函式關鍵字_declspec(dllimport)函式名等寫到應用程式相應的標頭檔案中就可以了。下面的例子通過隱式連結呼叫MyDll.dll庫中的Min函式。首先生成一個專案為TestDll,在 DllTest.h、DllTest.cpp檔案中分別輸入如下程式碼:
//Dlltest.h
#pragma comment(lib,"MyDll.lib")
extern"C"_declspec(dllimport) intMax(inta,int b);
extern"C"_declspec(dllimport) intMin(inta,int b);
//TestDll.cpp
#include
#include"Dlltest.h"
void main()
{
    inta;
    a=min(8,10)
    printf("比較的結果為%d\n",a);
}

在建立DllTest.exe檔案之前,要先將MyDll.dll和MyDll.lib拷貝到當前工程所在的目錄下面,也可以拷貝到windows的 System目錄下。如果DLL使用的是def檔案,要刪除TestDll.h檔案中關鍵字extern "C"。TestDll.h檔案中的關鍵字Progam commit是要Visual C+的編譯器在link時,連結到MyDll.lib檔案,當然,開發人員也可以不使用#pragma comment(lib,"MyDll.lib")語句,而直接在工程的Setting->Link頁的Object/Moduls欄填入 MyDll.lib既可。

程式設計時用ad.h,ad.lib,放在專案當前目錄裡
在標頭檔案中加入#include "ad.h"
在Project Setting–>Link–>Object/library modules加入ad.lib
執行時將ad.dll跟你的程式放在同一目錄

(二).顯式連結
顯式連結是應用程式在執行過程中隨時可以載入DLL檔案,也可以隨時解除安裝DLL檔案,這是隱式連結所無法作到的,所以顯式連結具有更好的靈活性,對於解釋性語言更為合適。不過實現顯式連結要麻煩一些。在應用程式中用LoadLibrary或MFC提供的AfxLoadLibrary顯式的將自己所做的動態連結庫調進來,動態連結庫的檔名即是上述兩個函式的引數,此後再用GetProcAddress()獲取想要引入的函式。自此,你就可以象使用如同在應用程式自定義的函式一樣來呼叫此引入函數了。在應用程式退出之前,應該用FreeLibrary或MFC提供的AfxFreeLibrary釋放動態連結庫。下面是通過顯式連結呼叫DLL中的Max函式的例子。

#include
#include
void main(void)
{
    typedefint(*pMax)(inta,int b);
    typedefint(*pMin)(inta,int b);
    HINSTANCEhDLL;
    PMaxMax
    HDLL=LoadLibrary("MyDll.dll");//載入動態連結庫MyDll.dll檔案;
    Max=(pMax)GetProcAddress(hDLL,"Max");
    A=Max(5,8);
    Printf("比較的結果為%d\n",a);
    FreeLibrary(hDLL);//解除安裝MyDll.dll檔案;
}


在上例中使用型別定義關鍵字typedef,定義指向和DLL中相同的函式原型指標,然後通過LoadLibray()將DLL載入到當前的應用程式中並返回當前DLL檔案的控制代碼,然後通過GetProcAddress()函式獲取匯入到應用程式中的函式指標,函式呼叫完畢後,使用 FreeLibrary()解除安裝DLL檔案。在編譯程式之前,首先要將DLL檔案拷貝到工程所在的目錄或Windows系統目錄下。

使用顯式連結應用程式編譯時不需要使用相應的Lib檔案。另外,使用GetProcAddress()函式時,可以利用 MAKEINTRESOURCE()函式直接使用DLL中函數出現的順序號,如將GetProcAddress(hDLL,"Min")改為 GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函式Min()在DLL中的順序號是2),這樣呼叫DLL中的函式速度很快,但是要記住函式的使用序號,否則會發生錯誤。