【发布时间】:2017-06-16 11:52:50
【问题描述】:
我从一个目录执行一个 exe,比如“C:/test”
DLL 位于“C:/test/dlls”目录中,因此,在这个 exe 中,我调用:
SetDllDirectory("C:/test/dlls");
然后我打电话
lib1 = LoadLibrary("lib1.dll)
和
ptrType pr = (ptrType) ::GetProcAddress(lib1, "test")
lib1.dll 需要目录“C:/test/dlls”中的其他 DLL,但是当我执行 pr(...) got from GetProcAddress 时,出现错误:
“程序无法启动,因为您的计算机中缺少 lib2.dll。请尝试重新安装程序以解决此问题。”
如果我将lib2.dll 移动到“C:/test”,它就会被找到。
这意味着SetDllDirectory() 仅对加载第一个 DLL 有效。
有谁知道为什么以及如何解决它?
【问题讨论】:
-
它没有回答你的问题,但我还是要问:将 DLL 放在应用程序文件夹的“dlls”子目录中的动机是什么?在 Windows 上,the application's directory is the application bundle,所以你应该把 DLL 放在那里。这还可以防止您受到安全问题的影响,例如将恶意 DLL 放置在当前目录中并错误加载。
-
您的诊断不正确。其他一些代码(可能在 lib1 中)正在将您的调用恢复为
SetDllDirectory。将所有 DLL 与可执行文件放在同一目录中,然后继续。 -
@DavidHeffernan:不,lib1 不会恢复调用
-
@CodyGray:因为我们有 70 个 DLL,我们想将它们分开。但也许你是对的,我们应该避免它,因为它只是为了“好看”的原因
-
将 DLL 与什么分开?其他可执行模块?有什么特别的目的?它不像应用程序目录是用户可见的。
标签: windows winapi dll setdlldirectory