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

sum*_*ame 4 c++ windows delphi dll delphi-2010

在我的一个项目中,我使用一个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进行应用

sum*_*ame 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环境变量中列出的目录.

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

  • +1因为当有人花时间给出正确答案时总是好的,特别是当他是第一个要求它的人时:) (2认同)