【发布时间】:2014-04-12 08:23:47
【问题描述】:
使用 Indy 10(修订版 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 中运行时不断收到错误是非常麻烦的。我只需要绑定到本地主机,不想绑定到所有地址。
更新:
我已经跟踪并添加了 OnException 和 OnListenerException 事件处理程序。终止时,我在 OnException 事件中收到 EAccessViolation 异常,并在我的帖子中指出了相同的错误消息。异常在到达 OnException 事件处理程序的第一行断点之前出现在 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,但仍然遇到同样的异常。
【问题讨论】: