1

私は Visual Studio 2010 を使用して、標準入力から読み取ろうとする Win32 アプリで作業しています。GetStdHandle(STD_INPUT_HANDLE) から有効なハンドルを取得し、ハンドルをパラメータとして WaitForSingleObject() をすぐに呼び出しますが、戻り値は常に WAIT_FAILED です。ファイル ハンドルの値が 01 であることを確認しました。これは奇妙です。通常、stdin は 0、stdout 1、および stderr 2 であるため、これはおそらく重要な手がかりです。

「エラー ルックアップ」ツールを使用すると、コード (6) はハンドルが無効であることを意味します。VS 出力ウィンドウで、以下のコードから「WAIT_FAILED.GetLastError() が返されました: 6」が表示されます。どんな助けでも大歓迎です。

   hStdIn = GetStdHandle( STD_INPUT_HANDLE );
   XTrace (L"hStdIn: %ul\r\n", hStdIn );
   if (INVALID_HANDLE_VALUE != hStdIn)
   {
        INPUT_RECORD inputRecord[512];
        DWORD nNumBytesRead;
        switch ( WaitForSingleObject( hStdIn, 1000 ) )
        {
            case( WAIT_TIMEOUT ):
                XTrace (L"WAIT_TIMEOUT\r\n" );
                break; // return from this function to allow thread to terminate
            case( WAIT_OBJECT_0 ):
                // clear events
                ReadConsoleInput( hStdIn, inputRecord, 512, &nNumBytesRead );
                XTrace (L"Called ReadConsoleInput(). WAIT_OBJECT_0\r\n" );
                break;
            case( WAIT_FAILED ):
                XTrace (L"WAIT_FAILED. GetLastError() returned: %d\r\n", GetLastError() );
                break;
            case( WAIT_ABANDONED ): 
                XTrace (L"WAIT_ABANDONED\r\n" );
                break;
            default:
                XTrace (L"Unexpected result from WaitForSingleObject\r\n" );
        }
    }
4

1 に答える 1

2

GetStdHandle言います:

ハンドルには GENERIC_READ および GENERIC_WRITE アクセス権があります

WaitForSingleObject言います:

ハンドルには SYNCHRONIZE アクセス権が必要です。

于 2015-01-16T19:55:31.303 に答える