【问题标题】:Why is WaitForSingleObject() considering the supplied handle to be invalid? [closed]为什么 WaitForSingleObject() 认为提供的句柄无效? [关闭]
【发布时间】:2015-01-16 19:51:26
【问题描述】:

我正在使用 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" );
        }
    }

【问题讨论】:

  • 我尝试时效果很好,很难猜到。你在重定向输入吗?然后你得到 NULL 来表示失败,而不是 INVALID_HANDLE_VALUE。你的错误检查是错误的。
  • 01 不是有效句柄。
  • 那个“0 for stdin”是文件描述符。句柄不是一回事。
  • @Hans、Raymond 和 Harry,请参阅下面的评论。我想我急于寻求另一种解决方案。但我很感谢你的建议。
  • 好吧,没有人会从这个 Q+A 中学到任何东西。呸。

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


【解决方案1】:

GetStdHandle 说:

句柄具有 GENERIC_READ 和 GENERIC_WRITE 访问权限

WaitForSingleObject 说:

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

【讨论】:

  • 如何为标准输入句柄建立 SYNCHRONIZE 访问权限?
  • 在阅读 MSDN 上 WaitForSingleObject 上的 cmets 时,我不确定它是否会按照您想要的方式工作,但您可以尝试一下:您可以通过创建新的 @ 来获得不同的权限987654324@ 通过DuplicateHandle.
  • @Alyoshak,这真的有效吗?因为如果这是问题所在,我认为您应该收到错误代码 5(拒绝访问)而不是错误 6(无效句柄)。
  • @Harry,我在阅读文档后将 Dark Falcon bc 归功于我发现他的回答表面上令人信服。也许我应该验证一下。由于事情是时间要求,我放弃了 WaitForSingleObject() 并从标准输入转向 C 风格的阅读。更简单。为了证明缺少 SYNCHRONIZE 访问权限是我不得不使用 CreateHandle() 而不是 GetStdHandle() 的问题,然后潜入 OVERLAPPED 混乱中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2019-04-21
  • 1970-01-01
  • 2013-12-25
  • 2016-04-24
  • 2020-09-26
相关资源
最近更新 更多