【问题标题】:PeekNamedPipe fails, but GetLastError returns 0PeekNamedPipe 失败,但 GetLastError 返回 0
【发布时间】:2013-10-17 07:41:12
【问题描述】:

我对 Windows API 感到困惑。我尝试使用PeekNamedPipe 查看匿名管道中是否还有字节。此函数失败,但GetLastError() 不返回错误。

我的代码的相关部分是

if( !PeekNamedPipe( handle, NULL, 0, NULL, &numBytesAvailable, NULL ) )
  throw PeekNamedPipeException( "GetLastError() returned " + std::to_string( GetLastError() ) );

这会引发错误,生成以下消息:

terminate called after throwing an instance of 'PeekNamedPipeException'
  what():  GetLastError() returned 0

但如果PeekNamedPipe 失败,GetLastError 不应该返回 0 (== ERROR_SUCCESS),对吧?

感谢您的帮助!

【问题讨论】:

    标签: c++ winapi pipe getlasterror


    【解决方案1】:

    这可能是因为在PeekNamedPipe 和您对GetLastError 的调用之间调用了更多系统函数(在幕后)。

    将来自GetLastError 的值存储在一个临时变量中,并在构造字符串时使用它。

    【讨论】:

    • +1 在这种特殊情况下,唯一可能导致这种情况的是从异常消息的文字前导中临时构造 std::string 调用的东西。 GetLastError() 在实际 ctor 之前触发,并且显然在 to_string 调用或实际抛出之前触发,因此除了临时字符串构造之外,我几乎可以看到所有其他内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    相关资源
    最近更新 更多