Raf*_*cci 6 delphi resources winapi wininet aqtime
我有一个应用程序,它集中使用Wininet
函数从Internet获取一些数据.我有时会得到一个非常奇怪的句柄相关错误消息:
Internal error in ConnectToHost when trying to create a session
ERROR_INTERNET_OUT_OF_HANDLES: No more handles could be generated at this time. Wininet error code = 12001;
Run Code Online (Sandbox Code Playgroud)
发生这种情况时,我注意到我的应用程序创建了超过5000个句柄.我运行了一个资源配置文件,我发现创建的一些句柄wininet
没有被释放.
所以,我创建了一个小应用程序来重现这个问题.代码很简单,除了分配一些wininet
句柄然后释放它们之外什么都不做.那是代码:
procedure request(const AUrl : AnsiString);
var
sMethod : AnsiString;
pSession : HINTERNET;
pConnection : HINTERNET;
pRequest : HINTERNET;
port : Integer;
flags : DWord;
begin
pSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned(pSession) then
try
Port := INTERNET_DEFAULT_HTTP_PORT;
pConnection := InternetConnectA(pSession, PAnsiChar(AUrl), port, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
if Assigned(pConnection) then
try
sMethod := 'GET';
flags := INTERNET_SERVICE_HTTP;
pRequest := HTTPOpenRequestA(pConnection, PAnsiChar(sMethod), PAnsiChar(AUrl), nil, nil, nil, flags, 0);
try
if Assigned(pRequest) then
ShowMessage('ok');
finally
InternetCloseHandle(pRequest);
end;
finally
InternetCloseHandle(pConnection);
end;
finally
InternetCloseHandle(pSession);
end;
end;
Run Code Online (Sandbox Code Playgroud)
在我的探查器上运行此示例,我得到相同的句柄相关问题.
我认为这InternetCloseHandle
不应该释放句柄,因为我的资源配置文件告诉我,当我关闭应用程序时,我有3个实时句柄.那些是没有被释放的句柄:
pRequest
pConnection
pSession
Run Code Online (Sandbox Code Playgroud)
有谁知道怎么摆脱这个?
编辑
功能InternetCloseHandle
正常,返回值为true
.
编辑
我在互联网上搜索了很多,但我找不到任何抱怨的人.但它正在发生.我想知道是否有人复制了这个问题,或者它是否仅仅是我.
原来是AQtime的问题。我下载了另一个分析器,我还查看了任务管理器,似乎句柄正在被释放。但有时我仍然会收到no more handles
错误,但我不知道为什么。但我会提出另一个问题,因为这个问题只是为了看看为什么这些句柄没有被释放。
感谢我得到的所有帮助。