2011-08-30 27 views
11

我有一個使用Win32 API編寫的C++ Win32應用程序,我希望強制它在某個函數中退出。有沒有像Exit()Destroy()Abort()類似的東西,只會終止它?如何通過API退出Win32應用程序?

+1

你需要它有多強大? –

+1

好吧,只需在那裏放棄,不要繼續。 – bodacydo

回答

1

ExitProcess是使用功能,否則你可以使用exit,請注意,無論是投保的完整性關閉(即:你很多泄漏處理等功能,併線程操作將被終止,即使他們是中途的操作,如DB提交)

12

PostQuitMessage()是退出窗口應用程序的標準,優雅的方式。

它不會立即退出,而是發佈退出消息,該消息將被您的主循環解析(如果正確完成),然後退出應用程序。

5

如果您正在使用具有適當窗口過程的Win32應用程序,則可以使用功能PostQuitMessage

2

剛從WinMain函數返回。如果您有消息循環,請使用PostQuitMessage來突破。不要試圖在執行過程中退出進程;它是馬虎。

25

Aiiieeeeeeeeeeee。不要做任何這些事情!

  • 退出()和ExitProcess的是採取了槍,臉上拍攝過程中的等價物。我希望我不必解釋爲什麼這不是很好,特別是對於持有共享對象(如可能是系統範圍的數據庫句柄)的進程。我知道這是Android的常態,但這是Windows,我們不會這樣做。

  • 直接調用PostQuitMessage()會導致內存泄漏。 PostQuitMessage()旨在從WM_DESTROY中調用。 這並非不是用於要求窗戶關閉的消息。這是應用程序將退出代碼發回到shell的回調機制。它旨在用應用程序退出代碼填充WM_QUIT。如果直接調用PostQuitMessage(),則會完全繞過WM_DESTROY。這是有問題的,因爲許多窗口 - 和子窗口小部件 - 非常正確perform their clean-up in WM_DESTROY.如果您通過躺在窗口上跳過此消息,您將拒絕組件清理的機會。

  • 由於我們在這個話題上,也不直接調用WM_DESTROY。微軟的Raymond Chen有一篇很好的文章,他解釋了"Sending a window a WM_DESTROY message is like prank calling somebody pretending to be the police".這是PostQuitMessage的邪惡雙胞胎之一。不要在沒有清理的情況下退出,而是要求窗口清理而不退出。窗口管理器從不知道刪除組件,並且在內存中留下了一個死的孤兒窗口。嘆。

正確答案是發佈WM_CLOSE。任何使用默認窗口過程的東西都會正確地通知窗口管理器銷燬窗口,該窗口將按照預期將級聯到WM_DESTROY然後再級聯到WM_QUIT。

如果您需要與標準關閉不同的行爲,另一種方法是創建一個WM_USER或WM_APP消息。如果你的窗口有一個「花哨的」WM_CLOSE--比如說,你給用戶一個提示「你確定要退出嗎?」 - 並且你想跳過它,你可以用WM_USER定義一條自定義消息或WM_APP並在其位置調用它。您的應用程序定義的消息將實現默認關閉行爲,並且與系統小工具綁定的WM_CLOSE會執行您的幻想行爲。

我希望有幫助!