Причина случайных сбоев в wininet.dll? - PullRequest
0 голосов
/ 12 августа 2010

Я получаю сбои глубоко в wininet.dll. Сбой при попытке прочитать нулевую ячейку памяти в HTTP_REQUEST_HANDLE_OBJECT::ReleaseConnection

Это ошибка в реальной DLL и не вызвана неправильным использованием?

WinInet! HTTP_REQUEST_HANDLE_OBJECT :: ReleaseConnection + 0x60
WinInet! HTTP_REQUEST_HANDLE_OBJECT :: CloseConnection + 0x84
WinInet! HTTP_REQUEST_HANDLE_OBJECT :: ReadData_Fsm + 0x5e8
WinInet! CFsm_ReadData :: RunSM + 0x2e
WinInet! CFSM :: Run + 0x39
WinInet! DoFsm + 0x25
WinInet! HTTP_REQUEST_HANDLE_OBJECT :: ReadData + 0x38
WinInet! HTTP_REQUEST_HANDLE_OBJECT :: HttpReadData_Fsm + 0x43
WinInet! CFsm_HttpReadData :: RunSM + 0x2e
WinInet! CFSM :: Run + 0x39
WinInet! DoFsm + 0x25
WinInet! HttpReadData + 0x67
WinInet! ReadFile_Fsm + 0x2d
WinInet! CFsm_ReadFile :: RunSM + 0x2b
WinInet! CFSM :: Run + 0x39
WinInet! DoFsm + 0x25
WinInet! InternetReadFile + 0x3ca

В контексте я пытаюсь загрузить файл. Я звоню

InternetReadFile (hFile, lpBuffer, dwNumberOfBytesToRead, lpdwNumberOfBytesRead);

Дескриптор hFile HINTERNET выглядит нормально (значение 0x00cc0024, что кажется допустимым), dwNumberOfBytesToRead - 20000.

Мой размер буфера составляет 131000, что тоже хорошо.

Дело в том, что мой код работает 99,9999% времени!

Ответы [ 2 ]

0 голосов
/ 17 августа 2010

Я обнаружил, что проблема была в вызове InternetCloseHandle в других потоках с уже закрытым дескриптором. Обычно это просто возвращает ERROR_INVALID_HANDLE, но в некоторых случаях вызывает сбой wininet либо в InternetCloseHandle, либо как в этом случае.

0 голосов
/ 12 августа 2010

Проверьте использование lpdwNumberOfBytesRead. Это должно быть либо

DWORD *lpdwNumberOfBytesRead = &someDWORDsomewhere;
InternetReadFile (..., lpdwNumberOfBytesRead);

или

DWORD NumBytes
InternetReadFile (..., &NumBytes);

У меня такое чувство, что вы делаете первый метод, не устанавливая переменную-указатель где-то в действительном состоянии.

...