Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi “印地”;无法加载SSL库“;德尔福XE2 IW14_Delphi_Ssl_Indy - Fatal编程技术网

Delphi “印地”;无法加载SSL库“;德尔福XE2 IW14

Delphi “印地”;无法加载SSL库“;德尔福XE2 IW14,delphi,ssl,indy,Delphi,Ssl,Indy,我知道以前有人问过这个问题,但没有一个答案适合这种情况 我正在使用一个带有SSL处理程序的TIdHttp组件。我的代码如下: idHTTPClient := TIdHTTP.Create(nil); ioHnd := TIdSSLIOHandlerSocketOpenSSL.Create(nil); ioHnd.DefaultPort := iSSL_PORT; ioHnd.SSLOptions.Mode := sslmClient; idHTTPClient.IOHandl

我知道以前有人问过这个问题,但没有一个答案适合这种情况

我正在使用一个带有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;
idHTTPClient:=TIdHTTP.Create(nil);
ioHnd:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
ioHnd.DefaultPort:=iSSL_端口;
ioHnd.SSLOptions.Mode:=sslmClient;
idHTTPClient.IOHandler:=ioHnd;
idHTTPClient.Request.AcceptEncoding:=“gzip,deflate,identity”;
idHTTPClient.Request.BasicAuthentication:=False;
尝试
idHTTPClient.Post(FFQDN、stmRequest、stmResponse);
除了
关于E:Exception-do
开始
如果IdSSLOpenSSLHeaders.WhichFailedToLoad“”则
开始
AddMsg('未能加载文件'+IdSSLOpenSSLHeaders.WhichFailedToLoad+'.+E.Message');
结束;
结束;
结束;
机器上有三个版本的ssleay32和libeay32.dll文件。其中一组与我的可执行文件(V1.0.0.5)位于同一文件夹中。一组在Apache bin文件夹(V0.9.8.20)中,一组在C:\Windows\SysWOW64中(没有版本,但日期为2003年)

应用程序启动时运行正常。但几天后,Post调用开始失败,出现“无法加载SSL库”。无法加载的文件有:

SSL\u会话\u获取\u id、SSL\u COMP\u获取\u压缩\u方法

一旦这个问题开始发生,它将不会消失,直到应用程序重新启动。然后在接下来的几天里它又能正常工作了


在我看来,由于某种原因,加载的DLL在几天后会发生变化。这是怎么发生的?我该怎么做才能确保每次加载正确的文件?

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

是否可能?尝试禁用任何防病毒软件。OpenSSL在Windows上的性能可能很差。OpenSSL开发者不理解DLL可以在Windows上加载、卸载和重新加载。它有时会引起很多问题,因为OpenSSL不相信它必须正确地清理(基于错误的假设,内存被回收,因为进程正在关闭)。泄漏的变量之一是
ssl\u comp\u方法
。见和。尝试禁用压缩。另外,comp泄漏信息。@jww在需要替换其中一个DLL时也会导致问题-由于DLL卡在内存中(尽管没有应用程序再使用它),会出现
访问被拒绝
错误。@jww:Indy在运行时动态加载OpenSSL DLL,加载后会一直加载到应用程序关闭,除非应用程序手动直接调用unload penssllibrary()。至于“无法加载SSL库”错误,这意味着Indy无法通过
GetProcAddress()
检索指定的函数指针。因此,这些错误与OpenSSL实现函数的方式无关,而与它们是否被导出无关。如果加载和卸载较新的DLL版本,然后加载较旧的版本,则可能会导致这些问题。