Windows用來定位DLL的搜索路徑個人經驗總結

點評:這篇文章主要介紹瞭Windows用來定位DLL的搜索路徑,有不明白的朋友可以參考下

《程序員面試寶典》一書中寫到,windows搜索dll文件的順序為:(1)內存(2)knowndlls(3)清單與.local(4)應用程序目錄(5)當前工作目錄(6)系統目錄(7)路徑變量

總覺得不太明白,遂查資料確認一下。

查msdn如下:http://msdn.microsoft.com/zh-cn/library/7d83bc18.aspx

通過隱式和顯式鏈接,Windows 首先搜索“已知 DLL”,如 Kernel32.dll 和 User32.dll。Windows 然後按下列順序搜索 DLL:

當前進程的可執行模塊所在的目錄。

當前目錄。

Windows 系統目錄。GetSystemDirectory 函數檢索此目錄的路徑。

Windows 目錄。GetWindowsDirectory 函數檢索此目錄的路徑。

PATH 環境變量中列出的目錄。

隱式鏈接有時稱為靜態加載或加載時動態鏈接。顯式鏈接有時稱為動態加載或運行時動態鏈接。

在隱式鏈接下,使用 DLL 的可執行文件鏈接到該 DLL 的創建者所提供的導入庫(.lib 文件)。使用 DLL 的可執行文件加載時,操作系統加載此 DLL。客戶端可執行文件調用 DLL 的導出函數,就好像這些函數包含在可執行文件內一樣。

在顯式鏈接下,使用 DLL 的可執行文件必須進行函數調用以顯式加載和卸載該 DLL,並訪問該 DLL 的導出函數。客戶端可執行文件必須通過函數指針調用導出函數。

“已知的 DLL”(非正式名稱)的功能指由內核的模塊加載器進行特殊處理的 DLL(動態鏈接庫)列表。當加載器發現具有指向已知的 DLL 的加載時動態鏈接的程序時,就會立即使用已知的副本,而忽略通常情況下應用於模塊加載的搜索算法。

那上面所寫的內存是什麼道理呢?搜索動態庫首先是內存,如果內存中存在就不需要加載,否則需要搜索到後加載到內存中。dll的主要優點也是節省內存和減少交換操作。很多進程可以同時使用一個 DLL,在內存中共享該 DLL 的一個副本。相反,對於每個用靜態鏈接庫生成的應用程序,Windows 必須在內存中加載庫代碼的一個副本。

感覺.local文件像是配置之類的,沒查到相關資料,不清楚。

當前工作目錄 (Current Working Directory), 一般來說,每個進程都有一個與之相關聯的分級文件系統(hierarchical file system)下的目錄,稱之為該進程的當前工作目錄。如果程序剛進入main入口處的時候,當前工作目錄其實就是程序啟動的目錄,但是當前工作目錄是可以通過程序進行設置或者隨著OpenFileDialog、SaveFileDialog等對象所確定的目錄而改變。

應用程序所在的目錄, 該進程從中啟動的目錄,即程序文件自身所在的目錄。和當前工作目錄是不同的。

Leave a Reply

Your email address will not be published. Required fields are marked *