Я успешно использую TIdHttp от Indy (версия 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.
Если я копирую libeay32.dll
и ssleay32.dll
из папки exe и помещаю их в папку C:\ProgramData\CommonData\
, а затем задаю путь SSL с помощью IdOpenSSLSetLibPath
(см. Ниже), я получаю сообщение об ошибке, утверждающее, что он не может загрузить библиотеки 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 ищет в правильном месте, где должен найти идентичный файл.
Я не знаю, должен ли я вызывать IdOpenSSLSetLibPath
до или после создания HttpClient, или до или после назначения IdSSLIOHandler, но это не так.кажется, не имеет большого значения в любом случае.
Я проверил эти сообщения здесь и здесь , а также сообщение на форуме здесь
Может кто-нибудь сказать мне, почемуидентичные библиотеки SSL загружаются и работают правильно, когда они находятся в папке exe, но не в подпапке ProgramData, назначенной с помощью IdOpenSSLSetLibPath
?- Еще лучше, как заставить это работать!
Кстати, я даже использовал утилиту сравнения двоичных файлов, чтобы гарантировать идентичность файлов SSL в двух местах, а также использовал PE, чтобы убедиться, что когда это работаетон действительно использует библиотеки DLL в папке exe, а не откуда-либо еще.