0

Я использую Visual Studio 2010 для работы с приложением Win32, которое пытается читать из stdin. Он извлекает действительный дескриптор из GetStdHandle (STD_INPUT_HANDLE) и сразу вызывает WaitForSingleObject() с дескриптором в качестве параметра, но возвращаемое значение всегда WAIT_FAILED. Я проверил, что значение дескриптора файла равно 01, что является нечетным bc stdin, как правило, 0, stdout 1 и stderr 2, поэтому это, вероятно, важный ключ.Почему WaitForSingleObject() считает, что предоставленный дескриптор недействителен?

Когда я использовал инструмент «Поиск ошибок», код (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

Работает нормально, когда я пытаюсь, трудно догадаться. Вы перенаправляете ввод? Затем вы получаете NULL для указания отказа, а не INVALID_HANDLE_VALUE. Ошибка проверки ошибок. –

+1

01 не является допустимой ручкой. –

+0

Эта вещь «0 для stdin» предназначена для файловых дескрипторов. Ручки - это не одно и то же. –

ответ

1

GetStdHandle говорит:

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

WaitForSingleObject говорит:

Ручка должна иметь право доступа СИНХРОНИЗИРОВАТЬ.

+0

Как кто-то установит права доступа SYNCHRONIZE для дескриптора stdin? – Alyoshak

+0

При чтении комментариев на 'WaitForSingleObject' в MSDN я не уверен, что он будет работать так, как вы хотите, но вы можете попробовать: вы можете получить разные разрешения, создав новую' HANDLE' через 'DuplicateHandle'. –

+0

@Alyoshak, сделал это фактически произведение? Потому что если это была проблема, я думаю, вы должны были получить код ошибки 5 (доступ запрещен), а не ошибку 6 (недействительный дескриптор). –