我目前正在撰寫后臺應用程式。它沒有運行視窗或控制臺,也沒有服務。我正在使用/SUBSYSTEM:WINDOWS我的 CMake 內部。
所以我知道有WM_CLOSE和CTRL_CLOSE_EVENT我可以生成一個不可見的視窗來等待WM_CLOSE.
我現在的問題是,如果應用程式不執行任何操作并且 Windows 想要關閉,會發生什么情況?
它只是殺死我的應用程式“SIGKILL”風格還是我在這里遺漏了什么?我想知道關機清理一些東西,主要是句柄
uj5u.com熱心網友回復:
在注銷/關閉時,與該會話關聯的所有行程都將終止。
(等價于TerminateProcess(),即windowsSIGKILL等價物)
這在 msdn 上的注銷/關閉中進行了描述。
通知
有幾種方法可以注冊處理程式以在行程終止之前獲取通知,具體取決于應用程式的型別:
- 控制臺應用程式可以使用
SetConsoleCtrlHandler() - GUI 應用程式可以處理
WM_QUERYENDSESSION/WM_ENDSESSION訊息- 請注意,不能保證您會收到
WM_CLOSE訊息 - 由于注銷/關閉時未呼叫處理程式,GUI 應用程式無法使用:備注部分:
SetConsoleCtrlHandler()
SetConsoleCtrlHandler()如果控制臺應用程式加載 gdi32.dll 或 user32.dll 庫,則不會為 CTRL_LOGOFF_EVENT 和 CTRL_SHUTDOWN_EVENT 事件呼叫您在呼叫 SetConsoleCtrlHandler 時指定的 HandlerRoutine 函式。
- 請注意,不能保證您會收到
- 服務可以使用
RegisterServiceCtrlHandlerEx()
注銷/關機不能永遠延遲
請注意,您不能通過這些通知永遠延遲注銷/關閉; /- 5 秒(非合同性)后,Windows 將顯示阻止關閉的應用程式串列,詢問用戶是否要強制關閉它們。(這個)
- 如果用戶選擇“仍然關閉”,您的行程將立即終止
- 如果用戶選擇“取消”,注銷/關閉將被取消,您的行程將生效
如果用戶在幾秒鐘內沒有選擇任何一個選項,那么 Windows 將自動選擇“仍然關閉”。(導致您的流程終止)
關于這個主題的好讀物:如果一個程式阻止關閉,那么所有程式都會阻止關閉雷蒙德陳
你需要做的清理作業
請注意,您不必在行程終止之前釋放分配的記憶體、關閉句柄等。
- 在行程終止時,所有分配的記憶體將被自動釋放,
- 所有手柄都將關閉,
- 并且所有分配的資源都將被釋放。
有關更多詳細資訊,請參閱終止行程。
因此,您唯一需要擔心的是特定于應用程式的狀態。(例如,如果您需要將記憶體狀態持久保存到磁盤)
我認為 Raymond Chen 關于行程關閉的這句話確實說明了這一點:
該建筑正在拆除。
不要費心掃地、清空垃圾桶和擦白板。
并且不要在建筑物的出口排隊,這樣每個人都可以將他們的進/出磁鐵移到外面。
你所做的只是讓拆遷隊等你完成這些毫無意義的大掃除任務。
即不要費心釋放分配的記憶體,關閉句柄等......如果你知道你的行程無論如何都將被終止;您所做的就是無緣無故地延遲關機/注銷。
關于這個主題的好讀物:
- 從 WM_ENDSESSION 訊息回傳后,您的行程可以隨時終止
- 當 DLL_PROCESS_DETACH 告訴你??行程正在退出時,你最好的選擇就是不做任何事情就回傳
- 為什么在行程關閉期間我從執行緒池中得到例外?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/531593.html
標籤:C 视窗温纳皮操作系统
