Delphi LoadLibrary无法找到DLL其他目录 - 有什么好的选择吗?

问题描述 投票:2回答:3

两个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?也许一个清单或什么?这是我正在寻找的那种“魔术子弹”。我知道我可以:

  1. 修改Windows路径,可能在安装程序中。那很难看。
  2. 将DLL的第二个副本直接添加到unwantedstepschild文件夹中。也很难看
  3. 在我们编码和测试正确的修复时延迟项目。不能接受的。
  4. 其他?

感谢您的指导,尤其是“其他”。我知道这个问题不一定是Delphi特有的。谢谢!

delphi dll path loadlibrary
3个回答
9
投票

LoadLibrary的MSDN文档告诉您Windows将在何处搜索DLL。您要么必须对DLL的路径进行硬编码,将其放在与应用程序相同的文件夹中,要么将其放在LoadLibrary文档中的其中一个默认搜索位置。


2
投票

这不是解决问题的完全解决方案,但当我弄清楚这个问题时,它会帮助我:

您可以通过LoadLibrary扩展SetDllDirectory的搜索路径。

来自MSDN-Doku

可以使用SetDllDirectory函数更改搜索路径。建议使用此解决方案,而不是使用SetCurrentDirectory或硬编码DLL的完整路径。

您需要在LoadLibrary调用之前添加一行:

SetDllDirectory(PChar('c:\fooapp'));

0
投票

或者您可以简单地编辑环境变量“path”并将路径放在那里的dll中。在这种情况下,将;c:\fooapp添加到路径应该就足够了。由于父项的环境变化会影响子项,因此您还可以创建一个加载器应用程序,该应用程序调整其环境变量,然后生成到您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.