動態鏈接庫--載入、卸載


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環境變量)


免責聲明!

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



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