我正在编写一个Windows服务程序最近。
编程时遇到的问题是,当我在其上安装程序时,Windows操作系统不能正常closures。 closures系统需要很长时间。 看来我的程序是问题的原因。
我试图find在互联网上的解决scheme,我发现添加“SERVICE_CONTROL_SHUTDOWN”我的代码可以是解决scheme。 我这样做,但我的程序不捕捉“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_STOPPED)
,并调用SvcSetStatus(SERVICE_STOPPED)
一旦服务完全停止。
此外,挂起的另一个可能的原因可能是如果您的服务为自己创建了一个顶级HWND
,并且它的窗口过程没有正确响应未处理的消息,例如调用DefWindowProc()
。 在关机期间,即使在服务过程中,某些消息也会广播到顶层窗口,并且需要响应。