【问题标题】:WinAPI Documentation contradicting itself?WinAPI 文档自相矛盾?
【发布时间】:2018-11-04 19:28:02
【问题描述】:

所以我一直在查看 Windows 文档,只是为了阅读一些内容并更广泛地了解 WinAPI 的工作原理等等,但是,我不禁注意到这样一个事实:在某些情况下,文档似乎自相矛盾,我需要确定哪种做事方式真的是正确的做事方式。我正在查看的具体示例涉及 GetMessage() 函数和“窗口消息循环”。

第一个站点 (Window Messages) 声明消息循环的正确语法如下...

MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

(如果您向下滚动,它就在页面底部附近的“已发布消息与已发送消息”标题之前)

文档解释说 WM_QUIT 消息会导致函数返回 0,这又会导致 while 循环中断和应用程序终止。否则,该函数将返回一个非零值,从而导致 while 循环继续。

第二个站点(The one for the GetMessage() function) 明确声明避免编写之前解释的代码。该站点表示 GetMessage() 函数可以在出错的情况下返回 -1 值,并且使用这样的代码

while (GetMessage( lpMsg, hWnd, 0, 0)) ...

如果函数返回 -1 将导致应用程序继续运行,即使它应该处理错误并正确终止。消息循环的有效实现应该是这样...

BOOL bRet;

while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}

我一直都是这样做的,这样如果碰巧有一个错误,我就可以捕捉到 -1 错误。但是在看到微软基本上自己犯了所谓的错误之后,我现在很困惑。那么它是微软吗?这样做有效还是无效?

MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

【问题讨论】:

标签: c winapi


【解决方案1】:

你不是在比较喜欢和喜欢。文档指出如果hWnd 无效,则返回-1

在第一种情况下,循环通过NULL

while (GetMessage(&msg, NULL, 0, 0))

所以-1 无法返回。但在第二个例子中

while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)

正在传递变量hWnd,因此可能会出现错误。

【讨论】:

  • 好吧,据我所知,将无效的 hWnd 传递到 GetMessage 将是一个错误的示例,但是,this tutorial 明确指出它仍然可以返回 -1 .
  • 如果消息指针无效,也可以返回-1,但如果是,程序还是坏了。我认为早期的文档已经改进,而且,在如此庞大的文档资源中,可能还存在其他不一致之处。无论如何,我喜欢 Window 的 BOOL 可以有 3 个值的方式 :)
  • 我想那是有道理的。你会建议仍然检查那个 -1 吗?即使你传入 NULL ,如果发生任何不好的事情,检查它似乎更安全;D
  • 是的,我想更严格一点是有意义的。如果发生这种情况,即使无法恢复,您也可以尝试优雅地失败。
  • @DavidHeffernan 正如 OP 指出的那样,-1 被退回还有其他原因。它在开发中可能比在发布版本中更有用。
猜你喜欢
  • 2018-07-22
  • 2021-04-13
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
相关资源
最近更新 更多