Windows用來定位DLL的搜尋路徑

來源:互聯網
上載者:User

   《程式員面試寶典》一書中寫到,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等對象所確定的目錄而改變。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.