最近在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.

希望可以帮到遇到同样问题的你。


本文由 王守红 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论