SERVICE_STATUS
文档说这个结构必须在调用SetServiceStatus()
函数时填写。
第三个字段为dwControlsAccepted
。
不幸的是,我没有找到任何关于控制代码必须始终被实现/至少反应的信息。
页面显示:
默认情况下,所有服务接受SERVICE_CONTROL_INTERROGATE值。
但是,当服务控制处理程序不响应SERVICE_CONTROL_STOP
控制代码时是否存在问题?在这种情况下,服务控制处理程序至少不调用SetServiceStatus()
是否存在问题?
就dwControlsAccepted
而言,没有强制控制码。如果满足需要,可以将此值设置为零。除了SERVICE_CONTROL_INTERROGATE
,你的代码不需要处理任何你没有指定为可接受的控制代码。
例如,如果你没有设置SERVICE_ACCEPT_STOP
,那么Windows将永远不会向你发送SERVICE_CONTROL_STOP
控件。任何停止服务的尝试都将导致错误1052,"请求的控件对此服务无效"。
如果你总是设置dwControlsAccepted
为零,这就是你所需要的控制处理程序:
static DWORD WINAPI ServiceHandlerEx(DWORD control, DWORD eventtype, LPVOID lpEventData, LPVOID lpContext)
{
if (control == SERVICE_CONTROL_INTERROGATE)
{
return NO_ERROR;
}
else
{
return ERROR_CALL_NOT_IMPLEMENTED;
}
}