2011-12-30 7 views
1

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(... 

手順がありません。

+0

あなたのコードのどこかにInternetSetStatusCallback()がありますか?そして、あなたが投稿したものではない実際のInternetReadFile()呼び出しは間違っていますか?目に見えないコードを診断するのは難しい。 –

+0

@ HansPasantはい、間違った動作を示すInternetReadFile()は投稿されたものです。コードの他の部分を投稿するべきだと思いますか? – kiewic

答えて

0

同様の問題が発生しましたが、スリープ(1000)を使用しても同じことが起こりました。私はサードパーティのカメラストリームに接続していました。私は完全に機能したデバッグバージョンで試しました。しかし、私がリリース版に戻ったとき、それはうまくいかないでしょう。

HttpOpenRequestのlplpszAcceptTypesをNULLに変更して修正したところ、すべてが機能するようになりました。

WinINetがインターネット接続を扱っているとき、異なるタイプの携帯電話/ OS /デバッグ、リリースバイナリバージョン/私たちが知ることのできない何らかの種類の操作をしているようです。

関連する問題