Почему WaitForSingleObject() считает предоставленный дескриптор недействительным?

Я использую Visual Studio 2010 для работы над приложением Win32, которое пытается читать из стандартного ввода. Он получает действительный дескриптор из GetStdHandle(STD_INPUT_HANDLE) и немедленно вызывает WaitForSingleObject() с дескриптором в качестве параметра, но возвращаемое значение всегда WAIT_FAILED. Я проверил, что значение дескриптора файла равно 01, что нечетно, bc 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" );
        }
    }

1 ответ

Решение

GetStdHandle говорит:

Дескриптор имеет права доступа GENERIC_READ и GENERIC_WRITE

WaitForSingleObject говорит:

Дескриптор должен иметь право доступа SYNCHRONIZE.

Другие вопросы по тегам