DLL載入方式:
應用程序能夠調用一個DLL中的函數之前,必須將該DLL的文件映射到調用進程的地址空間中,可以通過兩種方式:啟動時隱式載入 或 運行時顯示載入。
啟動時隱式載入:需要 .h、.lib、.dll;
運行時顯示載入:需要 .h、.dll;(.h只是告訴有哪些可調用符號,知道符號則可不添加)
DLL顯式載入和卸載:
通過 LoadLibrary 和 LoadLibraryEx 兩個函數會在用戶的系統中對DLL文件進行定位,並試圖將該文件映射到調用進程的地址空間中。
pszDLLPathName:
參數非全路徑或網絡路徑,那么將以標准路徑進行搜索;
參數傳入全路徑或網絡路徑,那么不在搜索其他地方而直接返回;
通過 FreeLibrary 和 FreeLibraryAndExitThread 來顯示地將DLL從進程地址空間中卸載。FreeLibrary會立刻將DLL從進程地址空間中卸載,如果先調FreeLibrary再調ExitThread,則導致調用ExitThread的代碼不復存在。
DLL顯示載入獲取導入函數地址:
通過GetProcAdress函數得到想要引用的符號的地址。只能傳PCTSTR字符,因為編譯器、鏈接器始終都是將符號的名稱以ANSI字符串的形式保存在DLL的導出段中。
DLL載入標准搜索路徑順序:
導入段只包含DLL的名稱,不包含DLL的路徑,因此加載程序必須在用戶的磁盤上搜索DLL。
加載程序搜索DLL的順序:
1、應用程序所在目錄;
2、Windows的系統目錄;(win32下為GetSystemDirectory獲得的system32目錄,win64下為GetSystemWow64Directory獲得的syswow64目錄)
3、16位的系統目錄;(Windows目錄中的System子目錄)
4、Windows目錄;
5、進程的當前目錄;(GetCurrentDirectory獲得目錄)
6、PATH環境變量中所列出的目錄;(只是當前用戶的Path環境變量)
設定DLL文件加載路徑:
如果希望從一個設定的文件夾中動態加載DLL,那么應該調用SetDllDirectory,並將程序庫所在的文件夾作為參數傳入。
1、應用程序所在目錄;
2、函數SetDllDirectory參數lpPathName給定的目錄;
3、Windows的系統目錄;(win32下為GetSystemDirectory獲得的system32目錄,win64下為GetSystemWow64Directory獲得的syswow64目錄)
4、16位的系統目錄;(Windows目錄中的System子目錄)
5、Windows目錄;
6、PATH環境變量中所列出的目錄;(只是當前用戶的Path環境變量)