簡體   English   中英

如何在Windows服務程序中捕獲SERVICE_CONTROL_SHUTDOWN代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM