2010-07-22 67 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