《程式員面試寶典》一書中寫到,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等對象所確定的目錄而改變。
應用程式所在的目錄, 該進程從中啟動的目錄,即程式檔案自身所在的目錄。和當前工作目錄是不同的。