SERVICE_STATUS
documentation表示在调用SetServiceStatus()
函数时必须填写此结构。
第三个字段是dwControlsAccepted
。
不幸的是,至少我没有找到任何关于必须总是实施/做出反应的控制码的信息。
页面上写着:
默认情况下,所有服务都接受SERVICE_CONTROL_INTERROGATE值。
但是,当服务控制处理程序没有对SERVICE_CONTROL_STOP
控制代码做出反应时,是否存在问题?服务控制处理程序在这种情况下至少调用SetServiceStatus()
时是否存在问题?
答案 0 :(得分:3)
就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;
}
}