No se pudo cargar la biblioteca SSL - dll no encontrado

Aug 21 2020

En mi programa Delphi (edición comunitaria 10.3), trato de usar Indy con la biblioteca OpenSSL, pero recibo un error

No se pudo cargar la biblioteca SSL

Mi biblioteca OpenSSL es la versión 1.0.2u y puse los archivos libeay32.dlly ssleay32.dllen el directorio EXE de mi programa, y ​​en Windows\SYSWOW64y Windows\System32.

He instalado Embarcadero Delphi Patch RS1033_Indy_SSL_Patch .

Después de la excepción, llamo WhichFailedToLoad()y el resultado es

No se pudo cargar libeay32.dll

Este es un programa simple que plantea la excepción:

url := 'https://www.google.it';
try
  Web := TIdHTTP.Create(nil);
  hIOHand := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  hIOHand.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2,sslvSSLv23];
  Web.IOHandler := hIOHand;
  Web.Request.UserAgent := INET_USERAGENT;       //Custom user agent string
  Web.RedirectMaximum := INET_REDIRECT_MAX;      //Maximum redirects
  Web.HandleRedirects := INET_REDIRECT_MAX <> 0; //Handle redirects
  Web.ReadTimeOut := INET_TIMEOUT_SECS * 1000;   //Read timeout msec
  try
    Sito := Web.Get(Url);
    Sito := DateToStr(Web.Response.LastModified) + Sito;
  except
    on e : exception do
      stg := WhichFailedToLoad();
  end;
finally
  Web.Free;
end;

¿Me pueden ayudar a resolver el problema?

Respuestas

2 RemyLebeau Aug 21 2020 at 00:24

Puse los archivos libeay32.dlly en el directorio EXE de mi programassleay32.dll

Eso está bien. Ese es el primer lugar donde el sistema operativo los buscará.

y dentro Windows\SYSWOW64y dentroWindows\System32

¡No hagas eso! Los archivos que no son del sistema no pertenecen allí. ESPECIALMENTE si está colocando los mismos archivos en ambas carpetas, ya que Windows\SYSWOW64está diseñado solo para archivos de 32 bits y Windows\System32solo para archivos de 64 bits.

No se pudo cargar libeay32.dll

Eso significa que Windows no pudo cargar esa DLL en la memoria. Probablemente porque no pudo encontrar el ssleay32.dllarchivo dependiente, pero más probablemente porque mezcló las versiones de 32 bits y 64 bits de las DLL. Si su aplicación está compilada como un EXE de 32 bits, debe usar la versión de 32 bits de ambas DLL. Si su aplicación está compilada como un EXE de 64 bits, debe usar la versión de 64 bits de ambas DLL.