使用Indy 10(rev.5128),如果我提供绑定到TIdHTTPServer和使用OpenSSL,我在终止时会在IDE中出现访问冲突。
错误消息如下: 项目Project1.exe引发异常类EAccessViolation,并在模块'ssleay32.dll'中显示“在地址1200DBB9处访问冲突”消息。写下地址FEEEFFDA'。
下面是一个简单的测试用例。只需创建一个表单,添加用途,然后将下面的代码放在表单create中。在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并且不想绑定到所有地址。
更新
我已经跟踪并添加了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,但我仍然有相同的例外。
答案 0 :(得分:0)
如果您不创建任何绑定,则TIdHTTPServer
在内部创建自己的绑定,一个用于IPv4,一个用于IPv6。
由于在调试器外部运行时没有看到异常,因此很可能在运行时被OpenSSL内部或TIdHTTPServer
或甚至RTL捕获。将事件处理程序分配给TIdHTTPServer.OnException
,TIdHTTPServer.OnListenException
和TApplication(Events).OnException
事件,并查看是否在其中任何事件中报告了异常。
如果您仍然遇到异常,请使用调试器中的调用堆栈更新您的问题,显示导致异常的各种函数调用。
最后,如果您使用任何其他版本的OpenSSL,您是否有相同的例外?
答案 1 :(得分:0)
我在使用中添加了IdGlobal,并修改了绑定以使IPv6 localhost地址也不再出现。
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;
虽然仍然很奇怪。