WinAPI Документация противоречит сама себе? - PullRequest
0 голосов
/ 04 ноября 2018

Итак, я просто просматривал документацию по Windows, чтобы почитать кое-что и получить более полное представление о том, как работает WinAPI и т. Д. Однако я не мог не заметить тот факт, что документация, кажется, противоречит сама себе в некоторых случаях, и мне нужно некоторое подтверждение того, какой способ ведения дел действительно является правильным способом ведения дел. Конкретный пример, который я рассматриваю, касается функции GetMessage () и «цикла сообщений окна».

Первый сайт ( Window Messages ) утверждает, что правильный синтаксис для цикла сообщений следующий ...

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

(если вы прокрутите страницу вниз, прямо перед заголовком ' Отправленные сообщения против отправленных сообщений ' в нижней части страницы)

Документ объясняет, что сообщение WM_QUIT заставляет функцию возвращать 0, что, в свою очередь, приведет к разрыву цикла while и завершению работы приложения. В противном случае функция вернет ненулевое значение, что приведет к продолжению цикла while.

Второй сайт ( Сайт для функции GetMessage ()) явно заявляет, что следует избегать написания кода, подобного описанному ранее. На этом сайте говорится, что функция 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, если она есть. Но после того, как Microsoft увидела, что, в сущности, допустила ошибку, я теперь растерялась. Так что же это за Microsoft? Это допустимо или недействительно, чтобы сделать это?

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

1 Ответ

0 голосов
/ 04 ноября 2018

Вы не сравниваете подобное с подобным. В документации говорится, что -1 возвращается, если hWnd недействительно.

В первом случае цикл проходит NULL

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

и, следовательно, -1 не может быть возвращено. Но во втором примере

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

переменная hWnd передается, поэтому может быть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...