Delphi 2010 - Wininet 句柄耗尽

标签 delphi winapi resources wininet aqtime

我有一个应用程序,它大量使用 Wininet 函数从互联网获取一些数据。有时我会收到非常奇怪的与句柄相关的错误消息:

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;

当这种情况发生时,我注意到我的应用程序创建了超过 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;

在我的探查器上运行此示例,我得到了相同的处理相关问题。

我认为 InternetCloseHandle 没有按应有的方式释放句柄,因为我的资源配置文件告诉我,当我关闭应用程序时,我有 3 个实时句柄。这些是未被释放的句柄:

pRequest
pConnection
pSession

有人知道如何摆脱这个吗?

编辑

函数InternetCloseHandle工作正常,返回值为true

编辑

我在互联网上搜索了很多,但找不到任何人对此提示。但它正在发生。我想知道是否有人重现了这个问题,还是只有我一个人遇到了这个问题。

最佳答案

原来是 AQtime 问题。我下载了另一个分析器,我还查看了任务管理器,似乎句柄正在被释放。但有时我仍然会收到 no more handles 错误,但我不知道为什么。但我会提出另一个问题,因为这个问题只是为了看看为什么这些句柄没有被释放。

感谢我得到的所有帮助。

关于Delphi 2010 - Wininet 句柄耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933376/

相关文章:

delphi - 使用 FFMpeg 播放 MemoryStream 中的视频

c++ - 从编译器运行和作为独立 exe 运行时,进程访问权限似乎有所不同

java - IntelliJ Idea + JavaFX = class.getResource() 返回 null

c++ - C++模板书的建议?

delphi - 在 DLL 中使用 IXMLDocument 需要 CoInitialize?

从资源生成的 C++/Win32 对话框行为不正常

xml - 当使用 msxml 的 XSLT 转换与根节点 ('/' 不匹配时该怎么办?

mysql - 如何清理 ODBC 数据库输入?

delphi - 有什么方法可以加快在位图 Canvas 上的绘制速度?

c# - 合并不同语言的程序