为什么WaitForSingleObject()认为提供的句柄无效?

时间:2015-01-16 19:51:27

标签: visual-studio-2010 windows-7 stdin filehandle waitforsingleobject

我正在使用Visual Studio 2010来处理尝试从stdin读取的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 个答案:

答案 0 :(得分:1)

GetStdHandle说:

  

句柄具有GENERIC_READ和GENERIC_WRITE访问权限

WaitForSingleObject说:

  

句柄必须具有SYNCHRONIZE访问权限。