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+0x2RunbSM
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

問題は、すでに閉じられたハンドルを持つ他のスレッドで InternetCloseHandle を呼び出すことにあることがわかりました。通常、これは ERROR_INVALID_HANDLE を返すだけですが、状況によっては、InternetCloseHandle またはこの場合のように wininet がクラッシュします。

于 2010-08-16T20:53:43.190 に答える
0

の使用を確認しますlpdwNumberOfBytesRead。どちらかである必要があります

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

また

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

ポインター変数を有効な場所に設定せずに最初のメソッドを実行しているように感じます。

于 2010-08-12T19:58:10.810 に答える