最近在Lazarus中使用TFPHTTPClient进行网络接口的访问,开始是正常的。由于要访问的数据比较多,就使用了多线程的TThread同时进行分段的访问,结果问题就来了。当进行调试的时候老是报“Could not initialize OpenSSL library”的错误,开始是以为使用的OpenSSL库的问题,重新下载了最新的放在应用程序的目录,结果还是报错。把libeay32.dll放到system32的目录里也是一样的错误。但是这个问题只是在调试的时候出现,正常运行也没问题,于是暂时就放下了。 结果今天程序出了个其它问题要调试,这个问题就绕不过去了.....欠的帐终究是要还的!!
通过一番研究发现,当在多线程中使用OpenSSL的时候,要先初始化一下SSL。就类似以前在多线程中使用ADO访问数据库要使用
CoInitialize(nil); .....CoUninitialize一样。 只需要在启动线程之前先用InitSSLInterface初始化一下,使用这个函数前要先引用openssl单元。
具体示例代码如下:
program project1;
uses
unit1, openssl;
var
MYThread: array[0..2] of TMyHTTPRequest;
i: integer;
begin
InitSSLInterface;
for i := 0 to 2 do
begin
MYThread[i] := TMyHTTPRequest.Create(True);
MYThread[i].FreeOnTerminate := True;
MYThread[i].Start;
end;
ReadLn;
end.
希望可以帮到遇到同样问题的你。
还不快抢沙发