我已成功使用Indy的TIdHttp(Delphi 2009的第10版)使用以下代码通过https发送数据
var
HttpClient: TIdHttp;
IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
FormData : TIdMultiPartFormDataStream;
begin
FormData := TIdMultiPartFormDataStream.Create;
HttpClient:= TIdHttp.Create;
IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create;
HttpClient.IOHandler := IdSSLIOHandler;
...
<the rest of the code that uses HttpClient in the normal way>
...
但是,这似乎仅在SSL文件libeay32.dll
和ssleay32.dll
与我的exe位于同一文件夹中时有效。我需要从ProgramData子文件夹中加载它们。
如果我从exe的文件夹中复制libeay32.dll
和ssleay32.dll
并将它们放在文件夹C:\ProgramData\CommonData\
中,然后使用IdOpenSSLSetLibPath
设置SSL路径(请参见下文),收到一条错误消息,指出它无法加载SLL库。
var
HttpClient: TIdHttp;
IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
FormData : TIdMultiPartFormDataStream;
begin
FormData := TIdMultiPartFormDataStream.Create;
HttpClient:= TIdHttp.Create;
IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create;
IdOpenSSLSetLibPath('C:\ProgramData\CommonData'); //set path to libeay32.dll and ssleay32.dll
HttpClient.IOHandler := IdSSLIOHandler;
...
<the rest of the code that uses HttpClient in the normal way>
...
在异常处理程序中使用showmessage(whichfailedtoload )
似乎是第一个未能加载的是C:\ProgramData\CommonData\libeay32.dll
。因此Indy正在寻找应该找到相同文件的正确位置。
我不知道在创建HttpClient之前还是之后,或者在分配IdSSLIOHandler之前或之后,我应该调用IdOpenSSLSetLibPath
,但这似乎没有多大区别。
我已经检查了这些帖子here和here,还有一个论坛帖子here
谁能告诉我为什么相同的SSL库在exe文件夹中加载并正常工作,而在使用IdOpenSSLSetLibPath
分配的ProgramData子文件夹中却不能正常加载吗? -更好地使它起作用!
顺便说一句,我什至使用了二进制文件比较实用程序来确保两个位置的SSL文件是相同的,并且还使用PE来确保它工作时确实使用exe文件夹中的DLL,而不是从其他地方来。
答案 0 :(得分:0)
我相信我可能已经找到了答案。我来自的SSL文件
openssl-1.0.0j-win32-vc.zip
。当我再次尝试使用从https://indy.fulgan.com/SSL/下载的openssl-1.0.2r-i386-win32.zip时,当文件位于ProgramData子文件夹中时,它可以正常工作。因此,看起来1.0.0j文件可能与1.0.2r所没有的其他文件包含某种依赖关系。
尽管这并不容易,尽管在一些SO帖子中提到了fulgan下载站点,好像我们应该知道它显而易见,并不是所有的帖子都提到了它,有些人只是说“获取最新的”库。试图找出哪些是最新的以及它们在哪里很困难。甚至富里根网站同时具有1.0.2r和1.0.2q,并且没有指示哪个是最新的(除非字母是某种字母的版本号)