Wininetで非同期要求を行うと、ステータスコールバック関数がINTERNET_STATUS_REQUEST_COMPLETEで呼び出されると、httpステータスコードが取得されます。InternetReadFile()はデータを読み取りますが、falseを返し、読み取ったバイト数をゼロに設定します。
result = HttpQueryInfo(
this->requestHandle,
HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
&value,
&sizeofDword,
&index);
返されるステータスコードは200です。その後、私はInternetReadFile()を呼び出します。
result = InternetReadFile(
this->requestHandle,
((char*)(this->buffer)) + this->totalBytesReceived,
this->bufferSize - this->totalBytesReceived,
&bytesRead);
this->totalBytesReceived += bytesRead;
trueを返し、lpNumberOfBytesReadを0に設定します。 GetLastError()はERROR_IO_PENDINGを返し、コールバック関数がINTERNET_STATUS_REQUEST_COMPLETEで再び呼び出されるのを待ちます。
これが発生すると、InternetReadFile()はtrueを返し、lpNumberOfBytesReadを再び0に設定します。
アプリケーションをデバッグすると、最初のInternetReadFile()の後に、応答データが既にlpBufferにあることがわかります。また、InternetReadFile()の前にSleep()を1秒間呼び出すと、InternetReadFile()が正しく動作します。
Sleep(1000);
result = InternetReadFile(...
手順がありません。
あなたのコードのどこかにInternetSetStatusCallback()がありますか?そして、あなたが投稿したものではない実際のInternetReadFile()呼び出しは間違っていますか?目に見えないコードを診断するのは難しい。 –
@ HansPasantはい、間違った動作を示すInternetReadFile()は投稿されたものです。コードの他の部分を投稿するべきだと思いますか? – kiewic