2

两个 Delphi 程序需要加载 foo.dll,其中包含一些将客户端身份验证证书注入 SOAP 请求的代码。foo.dll 位于 c:\fooapp\foo.dll 中,通常由 c:\fooapp\foo.exe 加载。这很好用。另一个程序需要相同的功能,但它位于 c:\program files\unwantedstepchild\sadapp.exe 中。两个应用程序都使用以下代码加载 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 的第二个副本直接添加到不需要的stepchild 文件夹中。也丑
  3. 在我们编码和测试适当的修复时延迟项目。不可接受。
  4. 其他?

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

4

3 回答 3

9

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

于 2010-03-30T12:45:14.670 回答
3

对于所提出的问题,这并不完全是一个解决方案,但是当我偶然发现这个问题时,它会对我有所帮助:

LoadLibrary您可以扩展via的搜索路径SetDllDirectory

来自MSDN-Doku

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

您需要在LoadLibrary通话之前添加一行:

SetDllDirectory(PChar('c:\fooapp'));
于 2017-12-28T18:09:16.210 回答
0

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

于 2010-03-30T18:02:03.150 回答