在我的一个项目中,我使用一个Delphi应用程序,它动态加载一个包装DLL(导出C-Style函数),这反过来又静态链接到一堆第三方DLL。
它在我的测试计算机上工作正常,但在我的客户计算机上无法初始化时出现错误消息“无法在TMYlibrary.dll中找到入口点_somefunction @ 4AKKZ”。
在使用sysinternal的进程监视器进行一些调查之后,我意识到Windows首先会在windows / sytem32中看到DLL,所以如果在system32中存在一个类似于 my DLL的DLL,那么windows会选择那个一,并尝试在其中找到我的函数入口点 - 这将失败。
你知道改变windows的DLL搜索行为的可能性吗?
其他信息
答案 0 :(得分:13)
我自己找到了另一种解决方案:
SetDllDirectory
会在要查看的位置列表中添加其他搜索路径。
来自http://msdn.microsoft.com/en-us/library/ms686203%28v=VS.85%29.aspx
调用SetDllDirectory后,DLL搜索路径为:
- 加载应用程序的目录。
- lpPathName参数指定的目录。
- 系统目录。使用GetSystemDirectory函数来获取 这个目录的路径。的名字 这个目录是System32。
- 16位系统目录。没有功能可以获得 这个目录的路径,但它是 搜索。该目录的名称 是系统。
- Windows目录。使用GetWindowsDirectory函数来获取 这个目录的路径。
- PATH环境变量中列出的目录。
醇>
(也许我应该在发布SO之前进行谷歌搜索;)
答案 1 :(得分:1)
将DLL发送到程序的文件夹中。 (与exe文件相同)。
然后Windows应首先尝试您的版本。