[英]How to catch SERVICE_CONTROL_SHUTDOWN code in Windows Service Program
我最近正在編寫Windows服務程序。
我在編程時面臨的問題是,當我在其上安裝程序時,Windows操作系統沒有正常關閉。 關閉系統需要很長時間。 看來我的程序是問題的原因。
我試圖在互聯網上找到解決方案,我發現在我的代碼中加入'SERVICE_CONTROL_SHUTDOWN'可以解決問題。 我這樣做了,但我的程序沒有捕獲'SERVICE_CONTROL_SHUTDOWN',我不知道為什么......
有誰知道為什么會這樣......誰能告訴我如何解決它? 謝謝。
我在下面的代碼中添加了一個片段。
// method that sets service status.
void SvcSetStatus(DWORD dwState, DWORD dwAccept = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN )
{
SERVICE_STATUS ss;
ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ss.dwCurrentState = dwState;
ss.dwControlsAccepted = dwAccept;
ss.dwWin32ExitCode = 0;
ss.dwServiceSpecificExitCode = 0;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
g_NowState = dwState;
SetServiceStatus(g_hSrv, &ss);
}
// method of service handler
void SvcHandler(DWORD fdwControl)
{
if (fdwControl == g_NowState)
{
return;
}
switch (fdwControl)
{
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
case SERVICE_CONTROL_STOP:
ShutdownService(FALSE);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_PRESHUTDOWN:
ShutdownService(TRUE); //???
break;
case SERVICE_CONTROL_SHUTDOWN:
ShutdownService(TRUE); //service finalize function (parameter is for shutdown or not)
break;
default:
SvcSetStatus(g_NowState);
break;
}
}
我在編程時面臨的問題是,當我在其上安裝程序時,Windows操作系統沒有正常關閉。 關閉系統需要很長時間。 看來我的程序是問題的原因。
這通常意味着您在SCM停止/關閉請求期間未正確報告狀態。 你沒有展示你的代碼ShutdownService()
但鑒於你已經編碼方式SvcHandler()
確保ShutdownService()
調用SvcSetStatus(SERVICE_STOP_PENDING)
定期在服務正在停止的過程,並呼吁SvcSetStatus(SERVICE_STOPPED)
一旦服務完全停止。
此外,掛起的另一個可能原因可能是您的服務為自己創建了頂級HWND
,並且其窗口過程未正確響應未處理的消息,例如通過調用DefWindowProc()
。 在關機期間,某些消息會被廣播到頂級窗口,即使在服務進程中也是如此,需要對它們進行響應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.