Как выйти из приложения Win32 через API? - PullRequest
15 голосов
/ 30 августа 2011

У меня есть приложение C32 Win32, написанное с использованием Win32 API, и я хочу заставить его выйти из одной из функций.Есть ли что-то вроде Exit() или Destroy() или Abort() что-то похожее, что просто прервало бы это?

Ответы [ 7 ]

34 голосов
/ 09 декабря 2014

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, который привязан к системным гаджетам, выполняет ваше причудливое поведение.

Надеюсь, это поможет!

11 голосов
/ 30 августа 2011

PostQuitMessage() - это стандартный, изящный способ выхода из оконного приложения.

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

4 голосов
/ 30 августа 2011

Если вы используете приложение Win32 с соответствующей процедурой окна, вы можете использовать функцию PostQuitMessage.

2 голосов
/ 30 августа 2011

Просто вернитесь из функции WinMain.Если у вас есть цикл сообщений, используйте PostQuitMessage, чтобы выйти из строя.Не пытайтесь выйти из процесса в середине выполнения;это небрежно.

2 голосов
/ 30 августа 2011

Если вы работаете с Visual C ++, используйте:

1 голос
/ 30 августа 2011
1 голос
/ 30 августа 2011

ExitProcess - это функция, которую вы можете использовать, в противном случае вы можете использовать exit, обратите внимание, что ни один из них не гарантирует целостность выключения (т. Е. У вас много ручек с утечками и т. Д., А операции с нитями будут прерваны, даже если они находятся на полпути через операция, такая как db commit)

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