C WinAPI文档自相矛盾?

C WinAPI文档自相矛盾?,c,winapi,C,Winapi,所以我一直在浏览Windows文档,只是为了阅读一些东西,并对WinAPI的工作原理有更广泛的了解,等等,我忍不住注意到,文档在某些情况下似乎自相矛盾,我需要确定哪种方式才是真正正确的方式。我看到的具体示例涉及GetMessage()函数和“窗口消息循环” 第一个站点()声明消息循环的正确语法如下 MSG msg = { }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); Dispat

所以我一直在浏览Windows文档,只是为了阅读一些东西,并对WinAPI的工作原理有更广泛的了解,等等,我忍不住注意到,文档在某些情况下似乎自相矛盾,我需要确定哪种方式才是真正正确的方式。我看到的具体示例涉及GetMessage()函数和“窗口消息循环”

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

MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
(如果向下滚动,它就在靠近页面底部的“已发布消息与已发送消息”标题之前)

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

第二个站点(显式声明)避免编写前面解释过的代码。该站点表示,如果出现错误,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);
}

您没有将like与like进行比较。文档说明,如果
hWnd
无效,则返回
-1

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

while (GetMessage(&msg, NULL, 0, 0))
因此不能返回
-1

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

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

看起来您使用的是正确的版本。请参阅MSDN上的。据我所知,将无效的hWnd传递到GetMessage将是一个错误示例,但是,明确声明它仍然可以返回-1。如果消息指针是无效的,但如果是这样的话,程序还是被破坏了。我认为早期的文档已经得到了改进,而且,在如此庞大的文档资源中,可能还有其他不一致之处。无论如何,我喜欢Window的
BOOL
可以有3个值的方式:)我想这是有意义的。你会建议继续检查-1吗?即使你的传递是空的,但是如果有什么不好的事情发生,检查它似乎更安全;我想,更严格一点是有道理的。如果发生这种情况,即使无法恢复,也可以尝试优雅地失败。@DavidHeffernan正如OP指出的,返回
-1
还有其他原因。它在开发中可能比在发布版本中更有用。