Просто технически, но у вас есть окно, и у вас есть цикл сообщений, просто нет в вашем коде.
Вызов MessageBox()
создает окно (класса # 32770) и запускает локальный цикл сообщений, не возвращаясь к вашему коду до тех пор, пока цикл сообщений не выпадет, предположительно при отправке WM_NCDESTROY
. Я думаю, что это тот же цикл сообщений, который запускается в ответ на DialogBox()
.
Но вы могли бы заменить ваш звонок на MessageBox()
чем-то другим, что действительно не создает цикл сообщений, и у вас все будет хорошо. Windows не заботится о том, есть ли у вас цикл обработки сообщений, хотя некоторые функции (в основном связанные с пользовательским интерфейсом) трудно или невозможно использовать без них. На самом деле вам вообще не нужно ссылаться на user32, а некоторые приложения, не имеющие пользовательского интерфейса, этого не делают.
Теперь, если вы создаете окно и не обрабатываете для него сообщения некоторым способом, Windows XP и выше заменит ваше окно "призрачным" окном с белой клиентской областью и диспетчером задач. скажет пользователю, что приложение не отвечает.
Хотя на первый взгляд кажется, что цикл обработки сообщений не является волшебным или строго обязательным элементом стандартной Windows-системы. Он является высоко укоренившимся в качестве стандарта в большинстве приложений Windows, потому что это лучший способ справиться с отправкой оконных сообщений. «Управляемая событиями» природа большинства приложений Windows заставляет нас иногда забывать, что приложения Windows изначально разрабатывались как однопоточные, и в этой модели это код, выполняющийся в этом единственном потоке, а не какая-то невидимая сила внутри операционной системы, это должно сделать каждый вызов функции в нашем коде. Добавление многопоточности несколько изменило это, но базовая модель все еще остается прежней.
EDIT
Примечание об очередях сообщений:
Как упоминалось в другом месте, очередь сообщений создается (и для каждого потока), только когда окно создано этим потоком. Ваша примерная программа после создания окна сообщения создает очередь сообщений. Но эта очередь не должна быть пустой при выходе из приложения. Эта очередь просто структура памяти. Это блок памяти, который может содержать определенное количество объектов сообщения (с указанием целевого hWnd, идентификатора сообщения, wParam, lParam, системного времени, когда сообщение было отправлено, позиции мыши, когда сообщение было отправлено, и некоторых данных, которые позволяют получить клавиатуру и состояние кнопки мыши, когда сообщение было отправлено), а также указатели на начало и конец очереди (я предполагаю, что это круговая очередь). При выходе из приложения эта память, как и вся память, принадлежащая процессу, освобождается в итоге.
Есть, конечно, и другие вещи, которые должны быть очищены вне вашего процесса. ОС должна вести таблицу всех существующих окон, например, вместе с потоком и процессом, который их создал. Конечно, все они также очищаются автоматически.