【问题标题】:Infernal Libraries (aka DLL Hell)地狱图书馆(又名 DLL 地狱)
【发布时间】:2010-07-22 07:04:20
【问题描述】:

在我的一个项目中,我使用了一个 Delphi 应用程序,它动态加载一个包装 DLL(导出 C 样式函数),该 DLL 又静态链接到一堆第 3 方 DLL。

它在我的测试机器上运行良好,但在我的客户计算机上它未能初始化,并出现错误消息,例如“在 TMYlibrary.dll 中找不到入口点 _somefunction@4AKKZ”。

在对 sysinternal 的进程监视器进行一些调查后,我意识到 Windows 会首先在 windows/sytem32 中查找 DLL,因此如果 system32 中存在与 my DLL 类似的 DLL,Windows 会选择它一个并尝试在其中找到我的函数入口点 - 这会失败。

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


其他信息

  • [更新] .exe 文件位于应用程序文件夹树的顶层。
  • Wrapper 和 3rd-party-DLL 都位于我的应用程序文件夹的子文件夹 /bin 中
  • 开发平台为 windows XP/7,dll 使用 VS2008,应用程序使用 Delphi 2010

【问题讨论】:

  • EXE 文件在哪里?也在 \bin 文件夹中?

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


【解决方案1】:

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

SetDllDirectory 将额外的搜索路径添加到要查看的位置列表中。

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

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

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

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

【讨论】:

  • +1 因为有人花时间给出正确答案总是好的,尤其是当他是第一个要求它的人时:)
  • 有人可能只是谷歌并点击了这个 SO 问题。这很有用。因此,值得提出并回答您自己的问题。
  • @warren:好点。我就是这样接触到这个网站的。
【解决方案2】:

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

那么 Windows 应该首先尝试您的版本。

【讨论】:

  • 他就是这么做的。你读过这个问题吗?还是他?问题含糊不清,没有说明 EXE 文件在哪里。
猜你喜欢
  • 2016-05-29
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多