0

我在 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::bSM+
wininet!CFsm::Run+0x39
wininet!DoFsm+0x25
wininet!InternetReadFile+0x3ca

上下文是我正在尝试下载文件。我打电话

InternetReadFile (hFile, lpBuffer, dwNumberOfBytesToRead, lpdwNumberOfBytesRead);

hFile HINTERNET 句柄似乎很好(值是 0x00cc0024,这似乎是合法的) dwNumberOfBytesToRead 是 20000。

我的缓冲区大小是 131000,这也很好。

问题是我的代码在 99.9999% 的时间内都能正常工作!

4

2 回答 2

0

检查使用lpdwNumberOfBytesRead. 它应该是

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

或者

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

我有一种感觉,您正在执行第一种方法,而没有将指针变量设置在有效的地方。

于 2010-08-12T19:58:10.810 回答
0

我发现问题在于在具有已关闭句柄的其他线程中调用 InternetCloseHandle。通常这只会返回 ERROR_INVALID_HANDLE 但在某些情况下会使 wininet 在 InternetCloseHandle 或本例中崩溃。

于 2010-08-16T20:53:43.190 回答