DLL 導入的兩種方式


轉至CSDN,原鏈接:https://blog.csdn.net/hellomike/article/details/4719338

1、隱式鏈接:
隱式鏈接的特點是由編譯器完成對DLL的加載和程序結束時對DLL的卸載工作,如果程序結束時如果還有其他應用程序使用該DLL,那么系統會使DLL的使用計數減1,當DLL的使用計數降為0時,會將DLL從內存中刪除。
★優缺點:隱式鏈接DLL的方法簡單實用,但缺少靈活性。
■使用方法:使用隱式鏈接DLL開發時,首先,需要將DLL的引入庫文件(*.lib--編譯生成DLL時,會一起生成的)與應用程序進行靜態鏈接,因為引入庫文件包含DLL的各種輸出資源,如導出函數,導出類等信息,這些信息指向DLL的函數指針等等,EXE執行時,DLL被 “自動” 加載,EXE退出時DLL被 “自動” 卸載。

2、顯示鏈接:
顯示鏈接方式是完全由編程者用API 加載和卸載DLL,編程者可以決定何時加載DLL,加載哪個DLL,何時卸載DLL,卸載哪個DLL等。
★優缺點:顯示鏈接方式充分體現了DLL的靈活性,是比較常用的調用DLL方式。但是與靜態鏈接相比稍微復雜了些。
■使用方法:
LoadLibrary(...):該 API 用於加載指定的DLL;
GetProcAddress(...):該 API 用於獲取DLL中導出函數的指針, 即導出函數的入口點;
FreeLibrary(...):該 API 用於卸載指定的DLL。

〓注:如果程序中多次調用LoadLibrary(...)加載同一DLL時,在卸載的時候也要調用相應次數的FreeLibrary(...)進行卸載。

3、舉例說明……
▲使用LoadLibrary顯式鏈接,在這個函數的參數中可以指定DLL文件的完整路徑。如果不指定路徑,Windows將遵循如下的搜索順序來定位DLL:

①EXE文件所在的目錄:
②進程的當前工作目錄:
③Windows系統目錄:例如:C:/WINDOWS/system32
④Windows目錄:例如:C:/WINDOWS
⑤環境變量的目錄:我的電腦-->屬性-->高級-->環境變量

說明:
●進程的當前工作目錄:使用函數SetCurrentDirectory(...)設置的路徑,或者從父進程繼承而來的路徑,使用GetCurrentDirectory(...)得到。
●EXE文件所在的目錄:本EXE文件所在的絕對路徑, 使用GetModuleFileName得到。
兩者可能不同。

▲GetProcAddress函數可以有兩種方式取得DLL導出函數的入口點:
例如:
GetProcAddress(hMod, "add"); //按照函數名稱方式;
GetProcAddress(hMod, MAKEINTRESOURCEA(1)); //按照導出函數序號方式;
---------------------
作者:hellomike
來源:CSDN
原文:https://blog.csdn.net/hellomike/article/details/4719338
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM