本文轉自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html
應用程序使用DLL可以采用兩種方式:
一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數的結構信息。
Visual C++6.0在VC\bin目錄下提供了一個名為Dumpbin.exe的小程序,用它可以查看DLL文件中的函數結構。另外,Windows系統將遵循下面的搜索順序來定位DLL:
1.包含EXE文件的目錄,
2.進程的當前工作目錄,
3.Windows系統目錄,
4.Windows目錄,
5.列在Path環境變量中的一系列目錄。
1.隱式鏈接
隱式鏈接就是在程序開始執行時就將DLL文件加載到應用程序當中。實現隱式鏈接很容易,只要將導入函數關鍵字_declspec(dllimport)函數名等寫到應用程序相應的頭文件中就可以了。
隱式鏈接 采用靜態加載的方式,比較簡單,需要 .h 、 .lib 、 .dll 三件套。新建 “ 控制台應用程序 ” 或 “ 空項目 ” 。配置如下 :項目->屬性->配置屬性->VC++ 目錄-> 在“包含目錄”里添加頭文件Mydll.h所在的目錄
項目->屬性->配置屬性->VC++ 目錄-> 在“庫目錄”里添加頭文件Mydll.lib所在的目錄
項目->屬性->配置屬性->鏈接器->輸入-> 在“附加依賴項”里添加“Mydll.lib”(若有多個 lib 則以空格隔開)
下面的例子通過隱式鏈接調用MyDll.dll庫中的Min函數。首先生成一個項目為testDLL,在testDLL.h、testDLL.cpp文件中分別輸入如下代碼:
//testDLL.h
extern " C "_declspec(dllimport) int Max( int a, int b);
extern " C "_declspec(dllimport) int Min( int a, int b);
// TestDll.cpp
#include
#include " Dlltest.h "
void main()
{ int a;
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既可。
2.顯式鏈接
#include
void main( void)
{
typedef int(*pMax)( int a, int b);
typedef int(*pMin)( int a, int b);
HINSTANCE hDLL;
PMax Max
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 中的函數速度很快,但是要記住函數的使用序號,否則會發生錯誤。
