Fab*_*zio 1 delphi indy delphi-2007
我正在尝试从此答案中TImage说明的URL 加载开始。
uses
GIFImg;
procedure TForm1.Button1Click(Sender: TObject);
var
Stream : TMemoryStream;
GIF : TGIFImage;
begin
Stream := TMemoryStream.Create;
GIF := TGIFImage.Create;
try
IdHTTP1.Get('http://www.google.com/intl/en_ALL/images/logo.gif', Stream);
//IdHTTP1.Get('https://www.google.com/intl/en_ALL/images/logo.gif', Stream);
Stream.Position := 0;
GIF.LoadFromStream(Stream);
Image1.Picture.Assign(GIF);
finally
FreeAndNil(GIF);
FreeAndNil(Stream);
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果URL以简单的HTTP开头,则一切正常。
当我尝试从HTTPS URL加载时,出现EIdIOHandlerPropInvalid异常消息:
IOHandler值无效。
我尝试添加一个TIdSSLIOHandlerSocketOpenSSL并将其设置IOHandler为TIdHTTP组件。
完成此操作后EIdOSSLCouldNotLoadSSLLibrary,出现以下消息异常:
无法加载SSL库。
属性是否存在问题或其他问题?
您需要安装在Windows中或与应用程序一起分发的SSL库(两个.DLL文件)。
似乎可以在这里下载:
https://slproweb.com/products/Win32OpenSSL.html
或通过其官方网站(但我在那里找不到可下载的二进制文件-仅源代码):
https://www.openssl.org/source/
可以在此处下载与Indy一起使用的预编译的.DLL:
https://indy.fulgan.com/SSL/(感谢Zed)
当我尝试从 HTTPS URL 加载时,收到一条
EIdIOHandlerPropInvalid异常消息:IOHandler 值无效。
该错误意味着您没有TIdSSLIOHandlerSocketBase附加到该TIdHTTP.IOHandler属性的派生组件,例如TIdSSLIOHandlerSocketOpenSSL.
此错误还告诉我您正在使用过时的 Indy 版本,需要升级。 请求 HTTPS url 时TIdHTTP自动创建默认值,并且当前未分配任何值,并且已经这样做了很长时间。SSLIOHandlerIOHandler
我尝试添加 a
TIdSSLIOHandlerSocketOpenSSL并将其设置为IOHandler组件TIdHTTP。
如果您不想升级,或者需要自定义设置SSLIOHandler,例如启用 TLS 1.1+(TIdSSLIOHandlerSocketOpenSSL 默认情况下尚不执行),那么这是正确的解决方案。
执行此操作后,我收到
EIdOSSLCouldNotLoadSSLLibrary异常并显示以下消息:无法加载 SSL 库。
该错误意味着
您还没有在您的应用程序中部署 OpenSSL DLL(libeay32.dll和ssleay32.dll),或者至少将它们安装在系统DLL 搜索路径上的某个位置。
您使用的 DLL 版本与您的 Indy 版本不兼容。当前版本的 Indy 支持 OpenSSL 1.0.2 及更早版本(对 OpenSSL 1.1.x 的支持目前正在进行中)。
引发错误后,您可以使用单元WhichFailedToLoad()中的 Indy 函数IdSSLOpenSSLHeaders来确定失败的根本原因 - DLL 本身是否无法加载到内存中(因为找不到它们等),或者因为它们缺少特定的导出印地需要的。