2010-07-22 69 views
4

在我的一個項目中,我使用了一個Delphi應用程序,它可以動態地加載一個包裝DLL(導出C樣式函數),這個DLL又是靜態鏈接到一堆第三方DLL的。地獄圖書館(又名DLL地獄)

它可以在我的測試機器上正常工作,但在我的客戶計算機上,它未能初始化出現錯誤消息,例如「無法在TMYlibrary.dll中找到入口點_somefunction @ 4AKKZ」。經過對sysinternal的進程監視器的一些調查後,我意識到Windows會首先在Windows/sytem32中查找fror DLL,因此如果在system32中存在一個類似於我的 DLL的DLL,Windows會選擇該DLL並嘗試找到我的功能入口點 - 這將失敗。

您是否知道可以更改Windows'DLL的搜索行爲?


其他信息

  • [更新] .exe文件位於應用程序的文件夾樹的頂層。
  • 包裝和第三方的dll ARê均設在我的應用程序文件夾
  • 開發平臺的子文件夾/ bin目錄窗口XP/7,使用VS2008爲源DLL1和Delphi 2010的應用程序
+0

哪裏EXE文件在什麼位置?還在\ bin文件夾中? – 2010-07-22 14:19:17

回答

13

我發現另一種解決辦法自己:

SetDllDirectory增加了額外的搜索路徑的位置看名單。

http://msdn.microsoft.com/en-us/library/ms686203%28v=VS.85%29.aspx

調用SetDllDirectory會後,DLL搜索路徑是:

  1. 從其中加載應用程序的目錄。
  2. 由lpPathName參數指定的目錄。
  3. 系統目錄。使用GetSystemDirectory函數獲取此目錄的路徑 。這個目錄的名字是 是System32。
  4. 16位系統目錄。沒有功能獲取此目錄的 路徑,但它搜索的是 。這個目錄的名字是 是System。
  5. Windows目錄。使用GetWindowsDirectory函數獲取此目錄的路徑 。
  6. PATH環境變量中列出的目錄。

(也許我應該做我的谷歌上搜索我張貼在此之前;)

+2

+1,因爲當有人花時間給出正確的答案時,總是很好,尤其是當他是第一個要求的人時:) – ereOn 2010-07-22 07:53:42

+0

有人可能只是谷歌,並打這個問題。這是有用的。所以值得回答和回答你自己的問題。 – 2010-07-22 14:18:03

+0

@warren:好點。這實際上是我如何接觸這個網站。 – sum1stolemyname 2010-07-22 15:00:42

1

將DLL發送到程序的文件夾中。 (與exe文件相同)。

然後Windows應該先嚐試你的版本。

+0

這就是他所做的。你讀過這個問題了嗎?還是他呢?這個問題是不明確的,並沒有說明EXE文件的位置。 – 2010-07-22 14:18:31