動態庫DLL加載方式-靜態加載和動態加載

靜態加載:

如果你有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)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

特點比較:

第一種是靜態鏈接方式,在這種方式下,動態鏈接庫中的所有數據代碼都將拷貝到調用程序的代碼空間中去,此時它和調用程序本身的函數沒有什麼區別;

第二種是動態鏈接方式,在這種方式下,動態鏈接庫中的數據代碼是在需要的時候才拷貝到內存中去的;

兩種方式都可以將外部(動態鏈接庫中的)代碼資源提供能調用者使用,但前者是全局的,雖隨時可以使用,但會增加內存;而後者是局部的,雖節省了內存,但會增加調用時間。

因此,在實際應用中應根據需要選擇哪種方式,一般多次調用則採用前面的方式,而單次調用則採用後面的方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章