У меня есть приложение, которое интенсивно использует функции 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
.
ИЗМЕНИТЬ
Я много искал в Интернете, но я не смог найти никого, кто жаловался бы на это. Но это происходит. Я хотел бы знать, воспроизвел ли кто-нибудь проблему или это только у меня.