6

我最近将我的 Delphi 7 升级到了 Delphi XE2,我对它有点陌生。我使用带有 OpenSSL 的 Indy 10 来接收 HTTP 内容。它工作得很好,我想与其他人分享我的程序。我刚刚发现如果没有 OpenSSL 库,我的程序将无法在其他 PC 上运行。我什至没有收到丢失 DLL 文件的异常、错误等。我认为 Indy10 要么具有原生 SSL 支持,要么至少在编译后使用资源中的 DLL,因此它是可移植的。我有两个问题:

1) 我怎样才能让用户知道他/她缺少 OpenSSL 库?(我的朋友在没有 OpenSSL DLL 的情况下没有报告异常、错误等。)

2) 是否可以让 Indy10 从资源中读取 OpenSSL 库?

4

2 回答 2

10

Indy 本身并没有实现 SSL。它所做的是实现了一个灵活的 IOHandler 架构,允许将任何 SSL 实现插入 Indy。Indy 本身实现了自己的基于 OpenSSL 的 IOHandler 类(计划在未来提供 MS CryptoAPI 支持)。例如,SecureBlackbox 为其自己的 SSL 引擎提供了一个 Indy IOHandler 类。

在大多数平台上,OpenSSL 通过外部 DLL 使用,不能从资源中使用。Indy 不附带 OpenSSL DLL,因为 OpenSSL 加密受到国际进出口法律的限制,所以要么在国际上发布的操作系统供应商有特殊的许可证来发布 OpenSSL DLL,要么最终用户必须在本地下载/编译 OpenSSL。这就是让 Indy 在 OpenSSL 方面“可移植”的原因 - Indy 使用在 Indy 外部预安装的任何 OpenSSL DLL,无论是在操作系统中还是在您的应用程序自己的安装文件夹中。

与 Indy 相关的唯一例外是 iOS 上的 OpenSSL,它要求静态使用 OpenSSL,因为 iOS 设备上不允许使用第三方动态库。

如果您想在其他平台上将 OpenSSL 与 Indy 一起静态使用,您必须自己编译/获取 OpenSSL 的静态版本并将其添加到您的项目中,然后重新编译 Indy 以启用其STATICLOAD_OPENSSL定义(目前仅针对 iOS 定义),并且最后IdSSLOpenSSLHeaders_static.pas在代码的子句中包含该单元uses以连接必要的支持代码。 请注意,这仅在最近发布的 Indy 10.6 版本中受支持。

如果这对您来说工作量太大,那么请使用与 Indy 兼容的第三方 SSL 实现,例如 SecureBlackbox,或者编写您自己的 IOHandler 类来满足您的需要。

至于你的其他问题:

1) 如果 Indy在套接字操作期间无法正确加载 OpenSSL,它会引发异常因此,这些异常很可能在您有机会向用户报告之前就被捕获并吞下。如果您不想依赖它,那么您可以在开始套接字工作之前手动调用单元 Load()中的 Indy 函数。如果 OpenSSL 尚未加载,则将其加载到内存中。如果失败,您可以调用同一单元中的函数来找出失败的原因。IdSSLOpenSSLHeaders.pasLoad()Load()WhichFailedToLoad()Load()

2) 不,不可能从资源中使用 OpenSSL(没有一些非常严重的低级技巧)。

于 2013-05-03T22:19:30.780 回答
1

1) 尝试在调用 Indy 之前自己加载 e DLL,如果 LoadLibrary 失败,您可以引发异常。

2)你可以,看看这个:

在 Delphi 应用程序中直接从内存中加载 DLL

于 2013-05-03T21:43:05.137 回答