地狱图书馆(又名DLL地狱)

时间:2010-07-22 07:04:20

标签: c++ windows delphi delphi-2010 dll

在我的一个项目中,我使用一个Delphi应用程序,它动态加载一个包装DLL(导出C-Style函数),这反过来又静态链接到一堆第三方DLL。

它在我的测试计算机上工作正常,但在我的客户计算机上无法初始化时出现错误消息“无法在TMYlibrary.dll中找到入口点_somefunction @ 4AKKZ”。

在使用sysinternal的进程监视器进行一些调查之后,我意识到Windows首先会在windows / sytem32中看到DLL,所以如果在system32中存在一个类似于 my DLL的DLL,那么windows会选择那个一,并尝试在其中找到我的函数入口点 - 这将失败。

你知道改变windows的DLL搜索行为的可能性吗?


其他信息

  • [更新] .exe文件位于应用程序文件夹树的顶层。
  • 包装器和第三方DLL都位于我的应用程序文件夹的子文件夹/ bin中
  • 开发平台是Windows XP / 7,使用VS2008为dlll和Delphi 2010为应用程序

2 个答案:

答案 0 :(得分:13)

我自己找到了另一种解决方案:

SetDllDirectory会在要查看的位置列表中添加其他搜索路径。

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

  

调用SetDllDirectory后,DLL搜索路径为:

     
      
  1. 加载应用程序的目录。
  2.   
  3. lpPathName参数指定的目录。
  4.   
  5. 系统目录。使用GetSystemDirectory函数来获取   这个目录的路径。的名字   这个目录是System32。
  6.   
  7. 16位系统目录。没有功能可以获得   这个目录的路径,但它是   搜索。该目录的名称   是系统。
  8.   
  9. Windows目录。使用GetWindowsDirectory函数来获取   这个目录的路径。
  10.   
  11. PATH环境变量中列出的目录。
  12.   

(也许我应该在发布SO之前进行谷歌搜索;)

答案 1 :(得分:1)

将DLL发送到程序的文件夹中。 (与exe文件相同)。

然后Windows应首先尝试您的版本。