У меня есть приложение С++ Win32, написанное с использованием Win32 API, и я хочу заставить его выйти из одной из функций. Есть что-то вроде Exit()
или Destroy()
или Abort()
что-то подобное, которое просто прекратит его?
Как выйти из приложения Win32 через API?
Ответ 1
ExitProcess
- это функция, которую вы можете использовать, иначе вы можете использовать exit
, обратите внимание, что ни застраховать целостность выключения (т.е. вы много разубедитет и т.д., а операции с потоками будут прекращены, даже если они находятся на полпути операция, например, фиксация db)
Ответ 2
Aiiieeeeeeeeeeee. Не делайте НИКАКИХ из этих вещей!
-
exit() и ExitProcess - это эквивалент взятия пистолета и съемки процесса в лицо. Надеюсь, мне не нужно объяснять, почему это не приятно, особенно для процессов, в которых хранятся общие объекты, такие как дескрипторы базы данных, которые могут быть общесистемными. Я знаю, что норма в Android, но это Windows, и мы не делаем этого здесь.
-
Вызов PostQuitMessage() напрямую может вызвать утечку памяти. PostQuitMessage() предназначен для вызова из WM_DESTROY. Это НЕ НЕ является сообщением, которое должно использоваться для запроса закрытия окна. Это механизм обратного вызова для приложений, чтобы отправить их код выхода обратно в оболочку. Он предназначен для заполнения WM_QUIT кодом выхода приложения. Если вы вызываете PostQuitMessage() напрямую, вы полностью обходите WM_DESTROY. Это проблематично, потому что многие окна - и дочерние виджеты - очень правильно выполняют свою очистку в WM_DESTROY. Если вы пропустите это сообщение, в окне вы откажете компонентам в возможности очистить.
-
И поскольку мы в теме, не вызываем WM_DESTROY напрямую. Раймонд Чен из Microsoft имеет замечательную статью, где он объясняет "Отправка окна сообщение WM_DESTROY похоже на шутки, призывая кого-то притворяться полицейским" . Это своего рода злой двойник PostQuitMessage. Вместо того, чтобы выходить без очистки, вы просите очистить окно без выхода. Менеджер окон никогда не знает, чтобы удалить компоненты, и у вас осталось мертвое сиротское окно в памяти. Вздох.
Правильный ответ - опубликовать WM_CLOSE.. Все, что использует стандартную процедуру окна, будет правильно уведомлять диспетчера окон, чтобы уничтожить окно, которое будет каскадироваться на WM_DESTROY, затем на WM_QUIT, как и предполагалось.
Если вам нужно другое поведение, чем стандартное закрытие, другой альтернативой является создание сообщения WM_USER или WM_APP. Если ваше окно имеет "причудливый" WM_CLOSE - скажем, например, вы даете пользователь запросит "Вы действительно хотите выйти?" - и вы хотите пропустить это, вы можете определить пользовательское сообщение с WM_USER или WM_APP и вызвать его на своем месте. Ваше сообщение, определяемое приложением, будет реализовывать поведение по умолчанию по умолчанию, а WM_CLOSE, связанный с системными гаджетами, выполняет ваше причудливое поведение.
Я надеюсь, что это поможет!
Ответ 3
PostQuitMessage()
- стандартный, изящный способ выхода из оконного приложения.
Он не сразу уйдет, а скорее опубликует сообщение quit, которое будет проанализировано вашим основным циклом (если выполнено правильно), а затем закройте приложение.
Ответ 4
Если вы используете приложение Win32
с надлежащей процедурой окна, вы можете использовать функцию PostQuitMessage
.
Ответ 5
Если вы работаете с визуальным С++, используйте:
Ответ 6
Просто вернитесь из функции WinMain
. Если у вас есть цикл сообщений, используйте PostQuitMessage
для выхода. Не пытайтесь выйти из процесса в середине выполнения; это неряшливо.
Ответ 7
Да, это exit()