两个Delphi程序需要加载foo.dll,其中包含一些将客户端身份验证证书注入SOAP请求的代码。 foo.dll位于c:\ fooapp \ foo.dll中,通常由c:\ fooapp \ foo.exe加载。这很好。另一个程序需要相同的功能,但它位于c:\ program files \ unwantedstepchild \ sadapp.exe中。两个aps都使用以下代码加载DLL:
FOOLib := LoadLibrary('foo.dll');
...
If FOOLib <> 0 then
begin
FOOProc := GetProcAddress(FOOLib , 'xInjectCert');
FOOProc(myHttpRequest, Data, CertName);
end;
它适用于foo.exe,因为dll就在那里。 sadapp.exe无法加载库,因此FOOLib为0,其余的永远不会被调用。因此,sadapp.exe程序默默无法注入证书,当我们对生产进行测试时,证书缺失,连接失败。显然,我们应该完全限定DLL的路径。在没有详细介绍的情况下,测试的某些方面直到最近都掩盖了这个问题,现在修复代码基本上已经太晚了,因为这需要完整的回归测试,而且没有时间。
既然我们已经把自己画成了一个角落,我需要知道是否有任何我忽略的选择。虽然我们无法更改代码(对于此版本),但我们可以调整安装程序。我发现将c:\ fooapp放入路径可以正常工作。将foo.dll的第二个副本直接添加到c:\ program files \ unwantedstepchild中也是如此。 c:\ fooapp \ foo.exe将在sadapp.exe运行时一直运行,所以我希望Windows能够找到它,但显然不是。有没有办法告诉Windows我真的想要相同的DLL?也许一个清单或什么?这是我正在寻找的那种“魔术子弹”。 我知道我可以:
感谢任何指导,尤其是“其他”。我知道这个问题不一定是Delphi特有的。谢谢!
答案 0 :(得分:9)
LoadLibrary的MSDN文档告诉您Windows将在何处搜索DLL。您要么必须对DLL的路径进行硬编码,将其放在与应用程序相同的文件夹中,要么将其放在LoadLibrary文档中的其中一个默认搜索位置。
答案 1 :(得分:2)
对于提出的问题,这不完全是一个解决方案,但当我弄清楚这个问题时,它会帮助我:
您可以通过SetDllDirectory
扩展LoadLibrary
的搜索路径。
来自MSDN-Doku:
可以使用SetDllDirectory函数更改搜索路径。 建议使用此解决方案,而不是使用SetCurrentDirectory或 硬编码DLL的完整路径。
您需要在LoadLibrary
来电之前添加一行:
SetDllDirectory(PChar('c:\fooapp'));
答案 2 :(得分:0)
或者您可以简单地编辑环境变量“path”并将路径放在那里的dll中。在这种情况下,将;c:\fooapp
添加到路径就足够了。由于父项的环境变化会影响子项,因此您还可以创建一个加载器应用程序,该应用程序调整其环境变量,然后生成到您的应用程序。