2013-05-03 117 views
3

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

1)我怎么让用户知道他/她缺少OpenSSL库? (我的朋友没有报告没有异常,错误等没有OpenSSL DLLs。)

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

回答

8

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

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

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

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

如果这对于您来说工作太多,那么请使用与Indy兼容的第三方SSL实施(如SecureBlackbox),或编写您自己的IOHandler类,以满足您的需求。

至于你的其他问题:

1)印确实引发异常,如果它不能在套接字操作正确加载OpenSSL的。因此,在您有机会向用户报告这些情况之前,这些例外会被抓住并吞下。如果你不想依赖它,那么在开始你的套接字工作之前,你可以手动调用Indy的Load()函数在IdSSLOpenSSLHeaders.pas单元中。如果尚未加载OpenSSL,则Load()将加载到内存中。如果Load()失败,则可以调用该单元中的WhichFailedToLoad()函数来找出为什么Load()失败。

2)不,从资源中使用OpenSSL是不可能的(没有一些真正严重的低级欺骗)。

+0

非常感谢!这为我清除了一切。 – 2013-05-03 22:30:14

+1

为什么Indy不能原生实现SSL?每个人都会因为这些外部DLL的需要而受苦。 – 2013-05-04 13:30:41

+1

这将是本地实施SSL的一项重大任务。当其他人已经提供实施时,为什么要浪费时间和精力?无论如何,我确实提到过我们计划为CryptoAPI创建一个IOHandler包装器,以便在Windows上解决DLL和导入/导出问题,因为它是内置于操作系统的。在其他平台上,通常使用OpenSSL。 – 2013-05-04 16:13:45

1

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

2)你可以看看这个:

Load a DLL From a Resource Directly From Memory in Delphi Applications

+0

这应该可行,但我将不得不编辑实际的Indy SourceCode,我不知道从哪里开始。 – 2013-05-03 21:45:08

+1

为什么要编辑Indy代码?该应用程序将只加载一次dll,所以如果你在调用indy之前加载它,你会没事的。 – 2013-05-03 21:46:28

+0

我不知道这是否可能,如果Indy已经在调用LoadLibrary之前做了什么(初始化)。而且,如果Indy调用GetModuleHandle等等,它会加载这些库大概两次或什么。还没有测试过任何东西,但我会稍后再做,看看它是否有效。 – 2013-05-03 21:52:07