靜態加載:
如果你有a.dll和a.lib,兩個文件都有的話可以用靜態加載的方式:
message函數的聲明你應該知道吧,把它的聲明和下面的語句寫到一個頭文件中
#pragma comment(lib, "a.lib")
然後你的對話框.cpp中包含這個頭文件就可以使用message函數了。
動態加載:
如果dll沒有對應的.lib文件,那麼就只能使用動態加載的方式了。
動態調用動態庫步驟:
1、創建一個函數指針,其指針數據類型要與調用的DLL引出函數相吻合。
2、通過Win32 API函數LoadLibrary()顯式的調用DLL,此函數返回DLL的實例句柄。
3、通過Win32 API函數GetProcAddress()獲取要調用的DLL的函數地址,把結果賦給自定義函數的指針類型。
4、使用函數指針來調用DLL函數。
5、最後調用完成後,通過Win32 API函數FreeLibrary()釋放DLL函數。
例如:
假設函數的聲明爲:void message(int a);
//函數指針聲明
typedef void (WINAPI MESSAGE)(int a);
MESSAGE *pMessage = 0;
//加載a.dll
HINSTANCE hDLLDrv = LoadLibrary("a.dll");
//獲取message函數的指針
if(hDLLDrv)
{
pMessage = (MESSAGE *)GetProcAddress(hDLLDrv, "message");
}
然後就可以這樣調用函數了:
pMessage(1);
用完後釋放:
FreeLibrary(hDLLDrv)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
特點比較:
第一種是靜態鏈接方式,在這種方式下,動態鏈接庫中的所有數據代碼都將拷貝到調用程序的代碼空間中去,此時它和調用程序本身的函數沒有什麼區別;
第二種是動態鏈接方式,在這種方式下,動態鏈接庫中的數據代碼是在需要的時候才拷貝到內存中去的;
兩種方式都可以將外部(動態鏈接庫中的)代碼資源提供能調用者使用,但前者是全局的,雖隨時可以使用,但會增加內存;而後者是局部的,雖節省了內存,但會增加調用時間。
因此,在實際應用中應根據需要選擇哪種方式,一般多次調用則採用前面的方式,而單次調用則採用後面的方式。