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

时间:2010-03-30 12:32:10

标签: delphi dll path loadlibrary

两个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的第二个副本直接添加到unwantedstepchild文件夹中。也丑陋
  3. 在我们编码和测试正确的修复时延迟项目。不可接受的。
  4. 其他?
  5. 感谢任何指导,尤其是“其他”。我知道这个问题不一定是Delphi特有的。谢谢!

3 个答案:

答案 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添加到路径就足够了。由于父项的环境变化会影响子项,因此您还可以创建一个加载器应用程序,该应用程序调整其环境变量,然后生成到您的应用程序。