Indy“无法加载SSL库” Delphi XE2 IW14

5

我知道这个问题之前已经被问过了,但是没有一个答案似乎适用于这种情况。

我正在使用带有SSL处理程序的TIdHttp组件。我的代码如下:

  idHTTPClient := TIdHTTP.Create(nil);
  ioHnd := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  ioHnd.DefaultPort := iSSL_PORT;
  ioHnd.SSLOptions.Mode := sslmClient;
  idHTTPClient.IOHandler := ioHnd;
  idHTTPClient.Request.AcceptEncoding := 'gzip,deflate,identity';
  idHTTPClient.Request.BasicAuthentication := False;

  try
    idHTTPClient.Post(FFQDN, stmRequest, stmResponse);
  except
    on E:Exception do
    begin
      if IdSSLOpenSSLHeaders.WhichFailedToLoad <> '' then
      begin
        AddMsg('Failed to load file ' + IdSSLOpenSSLHeaders.WhichFailedToLoad + '. ' + E.Message);
      end;
    end;
  end;

机器上有三个版本的ssleay32和libeay32.dll文件。其中一组位于与我的可执行文件(V1.0.0.5)相同的文件夹中。另一组位于Apache bin文件夹中(V0.9.8.20),还有一组位于C:\Windows\SysWOW64中(没有版本,但日期为2003年)。
应用程序启动时可以正常运行。但是几天后,Post调用开始失败并显示“无法加载SSL库”。无法加载的文件包括:
SSL_SESSION_get_id、SSL_COMP_get_compression_methods
一旦出现这个问题,除非重新启动应用程序,否则它将不会消失。然后再次正常工作几天。
在我看来,某种原因导致dll文件在几天后被加载时发生了更改。如何做才能确保每次加载正确的文件呢?

可能是杀毒软件?请尝试禁用任何杀毒软件。 - Jerry Dodge
OpenSSL在Windows上的性能可能较差。 OpenSSL开发人员不理解DLL可以在Windows上被加载、卸载和重新加载。这有时会引起很多问题,因为OpenSSL认为它不必正确清理(基于错误的假设,即内存会因进程关闭而被回收)。泄漏的变量之一是ssl_comp_methods。请参见Bug 2439Bug 2561。尝试禁用压缩。此外,压缩会泄漏信息。 - jww
@jww 这也会导致问题,当需要替换其中一个DLL时,会出现“访问被拒绝”的错误,因为该DLL仍然占用内存(尽管没有应用程序再使用它)。 - Jerry Dodge
3
@jww:Indy在运行时动态加载OpenSSL DLL文件,并且一旦加载,它会保持加载状态直到应用程序关闭,除非应用程序直接调用UnLoadOpenSSLLibrary()进行卸载。至于“无法加载SSL库”错误,这意味着Indy无法通过GetProcAddress()检索指定的函数指针。因此,这些错误与OpenSSL如何实现函数无关,而是是否导出了这些函数。如果加载并卸载了更新的DLL版本,然后加载了较旧的版本,则可能会导致这些问题。 - Remy Lebeau
1个回答

0
理想情况下,删除计算机上的所有其他版本的OpenSSL DLL,以确保您的应用程序始终找到正确的DLL。正是这些不同版本和进程(Apache)加载这些不同版本导致了冲突。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接