2011-07-01 33 views
3

我有一個正在從文檔搜索順序中未列出的地方加載DLL的過程(文檔鏈接如下)。我想知道爲什麼。未從文檔搜索路徑加載的DLL

這是我設置的描述:

  1. 我有一個文件夾 'C:\富' 包含A.DLL和B.DLL。
  2. 我有一個python腳本也存儲在c:\ foo中。
  3. python腳本通過ctypes執行LoadLibrary('c:/foo/a.dll')
  4. a.dll與b.dll的導入庫(即使用隱式鏈接)相鏈接。
  5. 我運行python腳本的當前目錄,比如c :.它可能是任何東西。
  6. b.dll從c:\ foo加載,即使這不在搜索路徑中。
  7. 看着過程監視器跟蹤,我可以看到所有記錄的搜索路徑都先嚐試過,並且都失敗了。然後python進程嘗試並無法打開「C:\ WINDOWS \ assembly \ GAC \ Microsoft.VC80.CRT.mui \ 8.0.50727.4053_en-US_1fc8b3b9a1e18e3b \ Microsoft.VC80.CRT.mui.DLL」,,然後打開c :\ FOO \ B.DLL。

因此,它似乎是a.dll的目錄正在搜索b.dll,即使文檔沒有說它應該是。此外,這發生在查看系統路徑後,這是瘋了。任何人都可以對此有所瞭解嗎?

同樣的事情發生在同樣使用a.dll的MatLab腳本中。

我運行Windows XP SP 3

This MSDN article解釋默認搜索順序。我引用:

  1. 由lpFileName指定的目錄。
  2. 系統目錄。使用GetSystemDirectory函數獲取此目錄的路徑。
  3. 16位系統目錄。沒有獲得該目錄路徑的函數,但它被搜索。
  4. Windows目錄。使用GetWindowsDirectory函數獲取此目錄的路徑。
  5. 當前目錄。
  6. PATH環境變量中列出的目錄。請注意,這不包括App Paths註冊表項指定的每個應用程序路徑。計算DLL搜索路徑時不使用App Paths鍵。
+0

你不能靜態鏈接到DLL。你的意思是隱式鏈接。 –

+0

@David:謝謝,我之前沒有聽說它被稱爲隱式鏈接。在MS的隱式鏈接定義中,他們說:「使用隱式鏈接,使用DLL的可執行文件鏈接到導入庫(.lib文件)」。我會更新這個問題。 –

+0

順便說一句,MS報價來自http://msdn.microsoft.com/en-us/library/9yd93633.aspx –

回答