【发布时间】:2019-10-12 06:41:43
【问题描述】:
我成功地使用 Indy 的 TIdHttp(版本 10 和 Delphi 2009)使用下面的代码通过 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 而不是来自其他地方。
【问题讨论】: