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

Chr*_*ton 2 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;
Run Code Online (Sandbox Code Playgroud)

它适用于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特有的.谢谢!

Ken*_*ite 9

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

  • 当前目录可能与应用程序目录Chris不同有几个原因.一种是在用于启动程序的快捷方式文件中设置"start in"属性.另一种方法是使用来自另一个目录的完整路径从控制台命令行启动程序.另一种情况是,如果您使用了TOpenDialog的默认设置,并且用户已使用该对话框选择文件.另一个,也许是最明显的,如果你打电话给ChDir.这不是**培训问题.无论用户如何启动,您的程序都应该有效. (7认同)
  • @Chris:Windows快捷方式具有"当前目录"字段.查看是否可以修改安装程序,以便在为其创建快捷方式时为SadApp设置当前目录. (4认同)