Delphi 2010 - У Wininet не хватает дескрипторов

У меня есть приложение, которое интенсивно использует функции 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 работает нормально, возвращаемое значение - правда .

РЕДАКТИРОВАТЬ

Я много искал в Интернете, но не смог найти никого, кто жаловался бы на это. Но это происходит. Я хотел бы знать, воспроизводил ли кто-нибудь проблему или это только я.

6
задан Alex 20 September 2011 в 13:32
поделиться