加載dll以及卸載dll相關的幾個API

普及一下知識:
(1)LoadLibrary函數指定的DLL模塊加載到進程的地址空間中。
調用成功,返回指定DLL文件的句柄,DLL句柄用來標識一個DLL文件。
調用失敗,返回NULL。

HMODULE LoadLibrary( LPCTSTR lpFileName // file name of module要加載的dll名 );

(2)LoadLibraryEx函數也可以加載指定的DLL模塊
調用成功,返回指定DLL文件的句柄,DLL句柄用來標識一個DLL文件。
調用失敗,返回NULL。

HMODULE LoadLibraryEx(  

LPCTSTR lpFileName, // file name of module 要加載的DLL名 HANDLE hFile, // reserved, must be NULL保留必須使用NULL DWORD dwFlags   // entry-point execution option 指定加載模塊時採取的動作

);

參數dwFlags取值如下:

DONT_RESOLVE_DLL_REFERENCES //不調用DLLMAIN函數。系統也不加載指定模塊引用的其他模塊 LOAD_LIBRARY_AS_DATAFILE //系統將指定的模塊作爲數據文件映射到調用進程的虛擬地址空間中 LOAD_WITH_ALTERED_SEARCH_PATH //使用替代搜索次序

附上更囉嗦的說明:
當調用LoadLibrary函數或者LoadLibraryEx函數時,系統會定位指定的DLL。
如果找到,則把DLL模塊映射到進程的虛擬內存中,並增加DLL的引用計數。
如果指定的DLL已經映射到調用進程的虛擬內存中,函數只是返回DLL的句柄,並不增加DLL的引用計數。
然後系統會在LoadLibrary函數或者LoadLibraryEx函數的線程上下文中調用DLL的入口函數DLLMain()。
如果系統找不到DLL文件,或者DLL的入口函數DllMain返回FALSE,則LoadLibrary函數或者LoadLibraryEx函數返回NULL。
如果LoadLibrary函數或者LoadLibraryEx函數執行成功,返回DLL模塊的句柄,DLL句柄可以用來標識一個DLL。

(3)GetModuleHandle函數也可以返回DLL模塊句柄
調用成功,返回指定DLL文件的句柄,DLL句柄用來標識一個DLL文件。
調用失敗,返回NULL。

HMODULE GetModuleHandle(  

LPCTSTR lpModuleName // module name 要加載的DLL文件名

);

附上更囉嗦的說明:
只有當DLL模塊映射到進程的虛擬地址空間中時,GetModuleHandle函數才能執行成功。
LoadLibrary函數或者LoadLibraryEx函數不同,GetModuleHandle函數不能增加DLL模塊的引用計數。
(4)GetProcAddress函數獲取DLL的導出函數地址。
調用成功,返回指定導出函數的地址。
調用失敗,返回NULL。

FARPROC GetProcAddress(  

HMODULE hModule, // handle to DLL module LPCSTR lpProcName // function name

);


(5)
如果不再需要使用DLL模塊,則可以調用FreeLibrary()函數或是FreeLibraryAndExitThread()函數釋放DLL模塊,
減少DLL模塊的引用計數,如果引用計數等於0,則從進程的虛擬地址空間卸載DLL代碼。

BOOL FreeLibrary(  

HMODULE hModule // handle to DLL module DLL模塊句柄

);//成功返回TRUE,失敗返回FALSE。

FreeLibraryAndExitThread( )在釋放DLL模塊後終止調用線程。

VOID FreeLibraryAndExitThread(  

HMODULE hModule, // handle to the DLL module DLL模塊句柄 DWORD dwExitCode // exit code for thread

);

The FreeLibraryAndExitThread function is implemented as:

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