Итак, я просто просматривал документацию по 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);
}