繁体   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