Impossibile caricare la libreria SSL - dll non trovata

Aug 21 2020

Nel mio programma Delphi (10.3 community edition), provo ad usare Indy con la libreria OpenSSL, ma ricevo un errore

Impossibile caricare la libreria SSL

La mia libreria OpenSSL è la versione 1.0.2u e inserisco i file libeay32.dlle ssleay32.dllnella directory EXE del mio programma e in Windows\SYSWOW64e Windows\System32.

Ho installato Embarcadero Delphi Patch RS1033_Indy_SSL_Patch .

Dopo l'eccezione, chiamo WhichFailedToLoad()e il risultato è

Impossibile caricare libeay32.dll

Questo è un semplice programma che solleva l'eccezione:

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;

Potete aiutarmi a risolvere il problema?

Risposte

2 RemyLebeau Aug 21 2020 at 00:24

Ho inserito i file libeay32.dlle ssleay32.dllnella directory EXE del mio programma

Questo va bene. Questo è il primo posto in cui il sistema operativo li cercherà.

e dentro Windows\SYSWOW64e dentroWindows\System32

Non farlo! I file non di sistema non vi appartengono. SOPRATTUTTO se stai inserendo gli stessi file in entrambe le cartelle, poiché Windows\SYSWOW64è pensato solo per file a 32 bit ed Windows\System32è pensato solo per file a 64 bit.

Impossibile caricare libeay32.dll

Ciò significa che Windows non è stato in grado di caricare quella DLL in memoria. Probabilmente perché non è riuscito a trovare il ssleay32.dllfile dipendente, ma più probabilmente perché hai confuso le versioni a 32 e 64 bit delle DLL. Se la tua app è compilata come EXE a 32 bit, devi usare la versione a 32 bit di entrambe le DLL. Se la tua app è compilata come EXE a 64 bit, devi usare la versione a 64 bit di entrambe le DLL.