由於每次使用動態鏈接庫的時候都要重新去查資料,查調用方式,有些煩躁,本人抽點時間在此做個總結,希望可以對需要的朋友有所幫助。
1,顯式加載方式加載動態鏈接庫
簡單易懂,隨掉隨用
(1) 將dll考到當前工作目錄,或者使用GetModuleFileName函數獲取當前執行目錄得到相對路徑,亦或者使用絕對路徑進行加載。
(2) 得到dll實例句柄
HMODULE LoadLibrary( LPCTSTR lpFileName )
( 3 ) 獲取dll中導出函數的地址
FARPROC GetProcAddress( HMODULE hModule,LPCSTR lpProcName )
Ex:typedef int (*ADDPROC)( int a, int b )
ADDPROC Add=(ADDPROC)GetProcAddress(hinst,”add”);
(4)FreeLibrary()調用結束釋放實例。
2 隱式加載方式加載動態鏈接庫
一:基本調用流程
(1) 使用_declspec(dllexport)導出函數
比如
_declspec(dllexport) int add( int a, int b )
添_stdcall extern c可有效解決名字改編問題
_stdcall extern c _declspec(dllexport) int add( int a, int b )
(2) 將dll文件考到當前工程,並連接lib文件
Vc6可以通過link連接,vs系列可以通過依賴庫連接
或者使用一種通用的方式加載,通過路徑加載
#pragma comment(lib,"../SDK/Sadp.lib")
(3)在調用處用extern做外部定義聲明
Ex:extern int add( int a , int b )
或者_declspec(dllimport) int add( int a, int b )
二:模塊定義文件(可有效解決名字改編問題)參考網絡通信庫
Library xxx.dll
EXPORTS
Add。。。。
3 顯式加載和隱式加載的比較
個人比較崇尚顯示加載兩個原因:
1, 隨掉隨用,易懂,並且不會因為某一個導出函數的調用的失敗導致程序的崩潰
2, 節省內存,調用結束直接釋放實例,而隱式加載從程序開始運行就一直伴隨著程序的整個過程,當dll比較多的時候很浪費內存。