如果提供绑定并使用OpenSSL,则终止时IDE中的Delphi Indy 10 TIdHTTPServer访问冲突

如果提供绑定并使用OpenSSL,则终止时IDE中的Delphi Indy 10 TIdHTTPServer访问冲突,delphi,openssl,indy10,Delphi,Openssl,Indy10,使用Indy 10(rev.5128),如果我向TIdHTTPServer提供绑定,并且使用OpenSSL,我在IDE终止时会遇到访问冲突 错误消息如下所示: Project Project1.exe引发异常类EAccessViolation,消息为“模块'ssleay32.dll'中地址1200DBB9处的访问冲突”。写下地址“FEEEFFDA” 下面是一个简单的测试用例。只需创建一个表单,添加用法,并将下面的代码放入表单创建中。在IDE中运行应用程序并访问[https://localhost

使用Indy 10(rev.5128),如果我向TIdHTTPServer提供绑定,并且使用OpenSSL,我在IDE终止时会遇到访问冲突

错误消息如下所示: Project Project1.exe引发异常类EAccessViolation,消息为“模块'ssleay32.dll'中地址1200DBB9处的访问冲突”。写下地址“FEEEFFDA”

下面是一个简单的测试用例。只需创建一个表单,添加用法,并将下面的代码放入表单创建中。在IDE中运行应用程序并访问[https://localhost]在浏览器中(您不会得到任何回复),然后关闭应用程序。IDE中会引发访问冲突(但正常运行时不会出现异常)。当然,您在运行时需要有openssl dll(我使用的是indy.fulgan.com网站上最新的1.0.1g)以及您自己的ssl证书文件

uses IdHTTPServer, IdSSLOpenSSL;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  HTTPServer:TIdHTTPServer;
begin
  HTTPServer := TIdHTTPServer.Create(Self);
  with HTTPServer do
  begin
    DefaultPort := 443;

    Bindings.Clear;
    with Bindings.Add do
    begin
      IP := '127.0.0.1';
    end;

    IOHandler := TIdServerIOHandlerSSLOpenSSL.Create(nil);
    with TIdServerIOHandlerSSLOpenSSL(IOHandler) do
    begin
      SSLOptions.RootCertFile := 'localhost.cer';
      SSLOptions.CertFile := 'localhost.cer';
      SSLOptions.KeyFile := 'localhost.key';
      SSLOptions.Method := sslvTLSv1;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;
    end;

    Active := True;
  end;
end;
如果未提供绑定,则不会出现IDE异常。在IDE中运行时不断出现错误是很麻烦的。我只需要绑定到localhost,不想绑定到所有地址

更新:

我已经跟踪并添加了OneException和OnListenerException事件处理程序。在终止时,我在OneException事件中收到了一个EAccessViolation异常,并在我的帖子中显示了相同的错误消息。异常在到达OneException事件处理程序的第一行断点之前出现在IDE中。在断点期间,调用堆栈如下所示:

TForm1.HTTPServerOnException($1892CA0,$18921FC) 
:0046fa45 TIdCustomTCPServer.DoException + $19 
:0041b6bf ThreadProc + $37 
:0040400e ThreadWrapper + $2A 
:74743daa KERNEL32.BaseThreadInitThunk + 0xe 
:76ef11c1 ntdll.RtlDispatchAPC + 0xcf 
:76ef1197 ntdll.RtlDispatchAPC + 0xa5

我曾尝试使用较旧的1.0.1f、0.9.8y和0.9.8x OpenSSL DLL,但仍有相同的例外。

如果不创建任何绑定,则
TIdHTTPServer
会在内部创建自己的绑定,一个用于IPv4,一个用于IPv6

由于在调试器外部运行时没有看到异常,因此可能在运行时被OpenSSL内部捕获,或者被
TIdHTTPServer
捕获,甚至被RTL捕获。将事件处理程序分配给
TIdHTTPServer.OneException
TIdHTTPServer.OnListenException
TApplication(Events).OneException
事件,并查看是否在其中任何事件中报告了异常

如果仍然出现异常,请使用调试器中的调用堆栈更新问题,该调用堆栈显示导致异常的各种函数调用


最后,如果您使用任何其他版本的OpenSSL,您是否有相同的异常?

我在使用中添加了IdGlobal,并修改了绑定,使其也具有IPv6本地主机地址,并且该异常不再出现

Bindings.Clear;
with Bindings.Add do
begin
  IP := '127.0.0.1';
  IPVersion := Id_IPv4;
end;
with Bindings.Add do
begin
  IP := '::1';
  IPVersion := Id_IPv6;
end;
不过还是很奇怪