Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.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 TIDHTTP:无法在非https URL上加载SSL库_Delphi_Indy_Indy10 - Fatal编程技术网

Delphi TIDHTTP:无法在非https URL上加载SSL库

Delphi TIDHTTP:无法在非https URL上加载SSL库,delphi,indy,indy10,Delphi,Indy,Indy10,我使用TIDHTTP从非https url下载zip文件,如下代码所示: IdHTTPProgress.DownloadFile('http://www.myurl.com/myfile.zip','c:\myfile.zip'); 尽管如此,我还是遇到了异常“无法加载SSL库”。例外情况会发生,但在那之后,无论如何都会进行下载 我怎样才能避免这个例外 谢谢发生异常的唯一方式是: 您已将TIdSSLIOHandlerSocketOpenSSL组件分配给TIdHTTP.IOHandler属性

我使用TIDHTTP从非https url下载zip文件,如下代码所示:

IdHTTPProgress.DownloadFile('http://www.myurl.com/myfile.zip','c:\myfile.zip');
尽管如此,我还是遇到了异常“无法加载SSL库”。例外情况会发生,但在那之后,无论如何都会进行下载

我怎样才能避免这个例外


谢谢

发生异常的唯一方式是:

  • 您已将
    TIdSSLIOHandlerSocketOpenSSL
    组件分配给
    TIdHTTP.IOHandler
    属性

    它将尝试初始化OpenSSL,即使您发出HTTP请求,因为任何HTTP请求都可能重定向到HTTPS,因此Indy在建立TCP连接时准备OpenSSL,以防万一

  • 您尚未在应用程序中部署OpenSSL dll(
    libeay32.dll
    ssleay32.dll
    ,或目标平台的等效dll),或者-您部署了与您的Indy版本不兼容的错误版本的dll

    如果要使用
    TIdSSLIOHandlerSocketOpenSSL
    ,则需要正确的DLL。Indy目前最多支持OpenSSL 1.0.2,但不支持OpenSSL 1.1.0或更高版本(即现在)

当Indy引发“无法加载SSL库”异常时,您可以在
IdSSLOpenSSLHeaders
单元中调用Indy的
WhichFailedToLoad()
函数,以确定故障是由于DLL未能加载到内存中,还是因为DLL缺少Indy所需的导出

IdSSLOpenSSL
单元中还有一个
OpenSSLVersion()
函数,用于报告已将哪个版本的OpenSSL加载到内存中


在您的情况下,没有从HTTP重定向到HTTPS,但是错误仍然在内部发生,这
TIdHTTP
吞没了HTTPS,因为HTTPS没有被使用。您的代码在运行时不会看到异常。但是你的调试器会的。

谢谢你的解释,Remy,但是在我的TIDTTP中IOHandler属性是空的。事实上,我没有部署OpenSSL DDL,因为我没有使用https,所以理论上我不需要它。只有在调试时才会发生异常。那么我应该忽略它吗?@delphirules异常是由
TIdSSLIOHandlerSocketOpenSSL
引发的。如果将
IOHandler
nil保留,则
TIdHTTP
将根据第一个请求是HTTP还是HTTPS(但仅当
IdSSLOpenSSL
uses
子句中时)在内部创建一个默认值。设置后,
IOHandler
不会自动更改。除非事先已设置了
tidsliohandlersocketopenssl
,否则无法请求HTTP url并获取SSL加载错误。@delphirules,如果未设置
tidsliohandlersocketopenssl
,并且发生了从HTTP重定向到HTTPS的情况,则会得到另一个异常(“IOHandler无效”)。但是是的,如果异常被
TIdHTTP
吞并,并且没有到达您的代码,那么您可以忽略它。也可以选择告诉调试器忽略它。如果您根本不想使用HTTPS,则不应该在项目中引用
IdSSLOpenSSL
单元。