Я использую 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");
}
}
Работает нормально, когда я пытаюсь, трудно догадаться. Вы перенаправляете ввод? Затем вы получаете NULL для указания отказа, а не INVALID_HANDLE_VALUE. Ошибка проверки ошибок. –
01 не является допустимой ручкой. –
Эта вещь «0 для stdin» предназначена для файловых дескрипторов. Ручки - это не одно и то же. –