1

我遇到了与此问题中提出的问题非常相似的问题(由于加载 SSL dll 的“问题”而必须在第一次加载时连接两次),但我很确定我使用的是最新版本的 Indy所以那里提出的解决方案不能解决我的问题。

我正在使用 Delphi7,并且我选择从 Delphi7 安装程序安装 Indy,因为该版本非常过时。在下载和安装 Indy10(从 SVN 源)之前,我确实从最新的 SVN 源安装了 Indy9,但我重新配置了 IDE 和项目设置以使用新的 Indy10 组件/路径而不是 Indy9。显然,该项目正在使用 Indy10 构建,因为我必须更改很多方法以匹配所有 Indy10 签名以进行编译。

我的 Indy10 SVN 存储库已从以下位置签出:https ://svn.atozed.com:444/svn/Indy10/trunk/Lib并显示大约 2 周前的最后一次提交修订版 4972——这看起来不像“一些真正的旧版 Indy10”。

我已经从http://opendec.wordpress.com/的二进制构建中下载了适用于 Win32 的 OpenSSL 1.0.1e (从我之前提到的其他 stackoverflow 问题中推荐的位置)并将其放在与我构建的 .exe 相同的文件夹中

这是我现在用来打开 SSL 连接的代码:

  try
    POP.Connect(Server,Port,Protocol,UserName,Password,TimeOut);
  Except
    on e : EIdOSSLCouldNotLoadSSLLibrary do
    begin
      ShowMessage('Failed to load: ' + WhichFailedToLoad());
      POP.Connect(Server,Port,Protocol,UserName,Password,TimeOut);
    end;
  end;

但是...这会导致 EIdOSSLCouldNotLoadSSLLibrary 异常,并且添加 WhichFailedToLoad 会显示完全相同的组件列表,这表明它需要 OpenSSL 的“indy specific”版本:

加载失败

但是等一下…… Remy 在链接的问题中回答说:“Indy 10 已更新为不再需要定制的 DLL。它现在按原样使用标准化的 OpenSSL DLL。” 那么为什么它会抱怨它需要 Indy 特定的功能呢?

我该如何解决为什么它第一次无法连接/说它需要我理解不再需要的功能?我期望它不应该寻找 indy 特定的功能不正确吗?

4

1 回答 1

1

我的猜测在问题的评论中得到证实,是您的编译器正在寻找 Indy 9 而不是 Indy 10 来构建您的项目。

事情可能会变得更糟,因为您的 IDE 可能在设计时使用一个版本,而编译器可能使用不同的版本。事实上,IDE 和编译器是链的不同部分,您可以破坏两者之间的原始同步。因为那样,我将解释这两种情况,正如我稍后解释的那样,你必须同时改变这两种情况。

IDE 和设计时间

设计时包由 IDE 加载以在您工作时创建对象,在对象检查器中向您显示该对象的属性,创建表单 DFM 文件并在您求助于 IDE 生成时获取要使用的方法用于响应事件的帕斯卡代码。

对于 IDE,您可以通过右键单击任何 Indy 组件来检查您在设计时使用的版本,如图所示。

在此处输入图像描述

要更改您在设计时使用的版本,请转到Component\Install packages并检查列表中的正确版本。您不能同时加载 Indy 9 和 Indy 10。

编译器和运行时

编译器使用库路径来查找您在项目中使用的不属于项目本身的单元,并将该代码与您的代码一起编译以生成可执行文件。

要检查哪个 Indy 版本链接到您的可执行文件,您可以Version使用所有 INdy 组件上的属性,例如:

ShowMessage('Indy version: ' + MyIndyComponent.Version);

要更改编译器首先找到的内容,您必须更改路径。您可以从 IDE 内部执行此操作。在现代 Delphi 中,您可以签入Tools\Options\Delphi options\Library\Library path\并且Project\Options\Delphi compiler\Search path\(我只是不记得 D7 中的选项在哪里)。

印地 9/10 案例

Indy 引入了接口破坏性更改,使得无法使用 Indy 10 编译为 Indy 9 编写的项目。事实上,项目的管理员不会等待主要版本破坏代码兼容性,并且您希望被迫调整您的升级到任何次要版本时的代码,如果它碰巧有不同的界面。

因此,您肯定在编译/运行时和 IDE/设计时都在使用 Indy 9,因此您必须在您的环境中进行调整。之后,准备重新编写部分代码进行调整。一旦你了解了发生了什么变化并学会了如何适应,变化就相当简单了。细节超出了这个答案的范围,但互联网上有足够的信息让你弄清楚如何去做。

于 2013-04-06T20:13:50.947 回答