首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Indy 10和OpenSSL

Indy 10和OpenSSL
EN

Stack Overflow用户
提问于 2013-05-04 05:32:44
回答 2查看 9.2K关注 0票数 6

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-04 06:19:31

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

在大多数平台上,OpenSSL是通过外部DLL使用的,而外部DLL不能从资源中使用。Indy不附带OpenSSL DLL,因为OpenSSL加密受到国际进出口法律的限制,因此要么是国际上发售的操作系统供应商拥有专门的许可证才能提供OpenSSL DLL,要么是最终用户必须自己在本地下载/编译OpenSSL。这就是为什么说到OpenSSL时,Indy是“可移植的”-- Indy使用预先安装在Indy之外的任何OpenSSL DLL,无论是在操作系统中还是在应用程序自己的安装文件夹中。

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

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

如果这对您来说太麻烦了,那么可以使用与Indy兼容的第三方SSL实现,比如SecureBlackbox,或者编写您自己的IOHandler类来满足您的需求。

至于你的其他问题:

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

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

票数 10
EN

Stack Overflow用户

发布于 2013-05-04 05:43:05

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

2)你可以,看看这个:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16367842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档