如何正确地使Indy TIdHttp使用来自特定文件夹的SSL库?

时间:2019-05-26 12:08:54

标签: http ssl indy

我已成功使用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.dllssleay32.dll与我的exe位于同一文件夹中时有效。我需要从ProgramData子文件夹中加载它们。

如果我从exe的文件夹中复制libeay32.dllssleay32.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,但这似乎没有多大区别。

我已经检查了这些帖子herehere,还有一个论坛帖子here

谁能告诉我为什么相同的SSL库在exe文件夹中加载并正常工作,而在使用IdOpenSSLSetLibPath分配的ProgramData子文件夹中却不能正常加载吗? -更好地使它起作用!

顺便说一句,我什至使用了二进制文件比较实用程序来确保两个位置的SSL文件是相同的,并且还使用PE来确保它工作时确实使用exe文件夹中的DLL,而不是从其他地方来。

1 个答案:

答案 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,并且没有指示哪个是最新的(除非字母是某种字母的版本号)