两个 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?也许是清单之类的?这就是我正在寻找的那种“灵丹妙药”。我知道我可以:
- 修改windows路径,可能在安装程序中。太丑了
- 将 DLL 的第二个副本直接添加到不需要的stepchild 文件夹中。也丑
- 在我们编码和测试适当的修复时延迟项目。不可接受。
- 其他?
感谢您的任何指导,尤其是“其他”。我知道这个问题不一定是 Delphi 特有的。谢谢!