我最近正在编写一个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()
calls SvcSetStatus(SERVICE_STOP_PENDING)
在服务停止过程中定期调用SvcSetStatus(SERVICE_STOPPED)
一旦服务完全停止。
此外,挂起的另一个可能原因可能是您的服务创建了顶级HWND
其自身及其窗口过程未正确响应未处理的消息,例如通过调用DefWindowProc()
。在关闭期间,某些消息会广播到顶级窗口,甚至在服务进程中,并且需要对其进行响应。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)