1. 程式人生 > >DLL 匯入的兩種方式

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
版權宣告:本文為博主原創文章,轉載請附上博文連結!