我正在绞尽脑汁试图想出一个DLL加载问题的优雅解决方案.我有一个静态链接到其他加载DLL的lib文件的应用程序.我没有直接加载DLL.我想在可执行文件所在的文件夹之外的另一个文件夹中安装一些DLL.像%working_folder%\ dlls这样的东西 - 我宁愿在我的%working_folder%中没有几十个(是...几十个)DLL .
我正在尝试开发一些主要应用程序的一部分,它将调整搜索路径@ startup.我遇到的问题是这个新的自定义DLL路径不在系统搜索路径中.当我启动应用程序时它崩溃(STATUS_DLL_NOT_FOUND)因为必要的DLL不在适当的位置.我想做的是检查@ startup是否这个新的自定义DLL文件夹在进程环境变量搜索路径中,如果没有添加它.问题是,应用程序尝试在应用程序执行一行代码之前加载所有这些DLL.
我该如何解决?我考虑过编写一个首先启动的帮助应用程序,适当调整环境变量,然后通过CreateProcess启动主应用程序.这将有效我确信它,但它使开发人员的事情变得困难.当他们调试主应用程序时,他们不会首先启动帮助应用程序 - 而不是他们甚至可以做到这一点.
我已经尝试过注册表应用程序路径功能但没有成功.像以前一样鸡和鸡蛋问题.
我能在这做什么?
我想通过访问当前工作目录来防止加载恶意DLL,如http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspx中所述.
在我们的C++应用程序中实现的解决方案是对SetDllDirectory("")进行WinAPI调用,这将有效地从Windows DLL加载搜索路径中删除当前工作目录.但是,似乎这个解决方案不适用于我们的Delphi应用程序,因为SetDllDirectory()函数不存在.
在Delphi中是否有与SetDllDirectory("")相同的调用?谢谢!
我从目录中执行一个 exe,比如“C:/test”
DLL 位于目录“C:/test/dlls”中,因此,在这个 exe 中,我调用:
SetDllDirectory("C:/test/dlls");
Run Code Online (Sandbox Code Playgroud)
然后我打电话
lib1 = LoadLibrary("lib1.dll)
Run Code Online (Sandbox Code Playgroud)
和
ptrType pr = (ptrType) ::GetProcAddress(lib1, "test")
Run Code Online (Sandbox Code Playgroud)
lib1.dll
需要目录“C:/test/dlls”中的其他 DLL,但是当我执行pr(...)
got from 时GetProcAddress
,出现错误:
“程序无法启动,因为您的计算机缺少 lib2.dll。尝试重新安装程序以解决此问题。”
如果我移动lib2.dll
到“C:/test”,它会被找到。这意味着这SetDllDirectory()
仅对加载第一个 DLL 有效。
有谁知道为什么以及如何解决它?