繁体   English   中英

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

[英]Infernal Libraries (aka DLL Hell)

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

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

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

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


附加信息

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

我自己找到了另一种方法:

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环境变量中列出的目录。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM