2012-02-20 2 views
0

を返します。非同期呼び出しは、私は非同期でファイルを読むためには、以下のC++のコードを書いた6エラーコード

#define BUF_SIZE 1024 
HANDLE hFile; 
DWORD NumberOfBytesRead = 0; 
BYTE *buf = (BYTE*)malloc(BUF_SIZE*sizeof(BYTE)); 
OVERLAPPED overlapped; 
overlapped.Offset = overlapped.OffsetHigh = 0; 

hFile = CreateFile("C:\\Users\\Desktop\\FOO.cpp", 
        GENERIC_READ, 
        FILE_SHARE_READ | FILE_SHARE_WRITE, 
        NULL, 
        OPEN_EXISTING, 
        FILE_FLAG_OVERLAPPED, 
        NULL); 



if (hFile == INVALID_HANDLE_VALUE) 
     printf("invalid hfile\n"); 

    int i; 
    i= ReadFile(hFile, 
       &buf, 
       BUF_SIZE, 
       &NumberOfBytesRead, 
       &overlapped); 

    if(!i && GetLastError() != ERROR_IO_PENDING) 
     printf ("ReadFile failed with error %d.\n", GetLastError()); 
    else 
    { 
    WaitForSingleObject(&(overlapped.hEvent), 0); 
    printf("here it is %d",NumberOfBytesRead); 
    } 

    CloseHandle(hFile); 

しかし、ReadFile関数の戻り値は0で、最後のエラーが6に等しいです。 誰もが考えているのですかなぜ? 6つのエラーコードは何を言いますか?

ありがとうございます。

+0

適切な初期化を追加するだけです: 'OVERLAPPED overlapped = {};'。 – avakar

+1

また、おそらくあなたは0ではなくINFINITEの時間を待つことを望んでいるでしょう。また、 'NumberOfBytesRead'は待ってから更新されません。GetOverlappedResultを呼び出して取得する必要があります。 – avakar

答えて

0

エラーコード6は、無効なハンドルを意味します。無効なハンドル値をチェックするので、奇妙に思える

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

。これがあなたを助けたかどうかはわかりませんが、最初にファイルを同期して開こうとするかもしれません。

+0

私はそれを同期的に開こうとしました、それは動作します。 – RRR

3

あなたの問題は、正しく初期化しないオーバーラップされた構造である可能性があります。 参照: "この構造体の未使用のメンバーは、構造体が関数呼び出しで使用される前に常に0に初期化されなければなりません。そうでないと、関数は失敗しERROR_INVALID_PARAMETERを返します。ここに備考:here。あなたはmemsetを使ってそのすべてをクリアすることができます。

+1

実際、「無効なハンドル」はおそらく 'overlapped.hEvent'を指しています。 –

+0

と..?それを修正するために私は何ができますか? – RRR

+0

何かのように:あなたのoverlapped.Offsetの代わりにmemset(&overlapped、0、sizeof(overlapped))= overlapped.OffsetHigh = 0;ライン。 – dbrank0

関連する問題