【问题标题】:Indy 10 - IdHTTP.Get raising "Could not load SSL library"Indy 10 - IdHTTP.Get 引发“无法加载 SSL 库”
【发布时间】:2016-05-19 09:09:06
【问题描述】:

在我的应用程序中,我使用的是 IdHTTP.Get。部分代码:

var
  IdHTTP: TIdHTTP;
begin
  IdHTTP := TIdHTTP.Create(nil);
  Output := IdHTTP.Get(url);
  ...
  IdHTTP.Free;

使用 IdHTTP.Version 可以得到版本:10.6.2.5263

我已经从here 下载了 OpenSSL,libeay32.dll 和 ssleay32.dll 都在我的应用程序的同一个文件夹中。

出现此问题是因为我使用的是装有 Windows 10 的新笔记本电脑。 我希望有人能告诉我如何解决这个问题!

【问题讨论】:

  • IdSSLOpenSSLHeaders unit 中使用Indy 的WhichFailedToLoad() 函数找出哪个DLL 加载失败。
  • 检查防火墙设置以阻止(特定于应用程序的)传出连接
  • @whosrdaddy 谢谢,看来只有 libeay32.dll 加载失败
  • @mjn 我把防火墙关了试过了,没用
  • @Teun:WhichFailedToLoad() 返回的究竟是什么?

标签: delphi ssl openssl indy


【解决方案1】:

在尝试了此处提供的各种解决方案后,它们都不适用于最新版本的 Windows 10 或 Windows 11。 我想分享我的有效解决方案:

只需安装最新版本的开放 SSL openssl-1.0.2u-x64_86-win64 可用here

在 1.0.2.21 版本中包含 TidHTTP libeay32.dll 和 ssleay32.dll 的两个必要库

【讨论】:

    【解决方案2】:

    在 64 位系统中为您的应用程序提供 32 位目标平台也会导致此问题。我不知道如何正确解决此问题,但一种简单的方法是为您的操作系统所在的同一系统编译 exe。

    【讨论】:

      【解决方案3】:

      如果你需要访问一个https url,你必须添加一些代码,才能完成TidHTTP组件的创建。

      尝试使用这样的东西:

      // create components
      HTTPs := Tidhttp.Create(nil);
      IdSSL := TIdSSLIOHandlerSocket.Create(nil);
      // try..finally for free
      try
        // ini
        HTTPs.ReadTimeout := 30000;
        HTTPs.IOHandler := IdSSL;
        IdSSL.SSLOptions.Method := sslvTLSv1;
        IdSSL.SSLOptions.Method := sslvTLSv1;
        IdSSL.SSLOptions.Mode := sslmUnassigned;
        ...
      

      您需要在uses子句中添加IdSSLOpenSSL

      【讨论】:

      • 我提到的代码过去对我有用,在我使用的其他计算机上仍然有效。它只是在我的新笔记本电脑上没有。所以我认为代码不是问题。
      • indyproject.org/sockets/blogs/ChangeLog/20141222.en.aspx,简单用例不需要IOHandler创建代码
      • TIdSSLIOHandlerSocket = TIdSSLIOHandlerSocketOpenSSL indy 最新版本
      • 我向 IOHandler 添加了额外的属性,但我仍然收到无法加载错误。
      • 检查 DLL 的版本是否正确。许多错误都是由此造成的。
      猜你喜欢
      • 2014-03-29
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多