哪些控制代码已在服务的控制处理程序中实现

时间:2016-09-15 05:35:08

标签: c winapi

SERVICE_STATUS documentation表示在调用SetServiceStatus()函数时必须填写此结构。

第三个字段是dwControlsAccepted

不幸的是,至少我没有找到任何关于必须总是实施/做出反应的控制码的信息。

页面上写着:

  

默认情况下,所有服务都接受SERVICE_CONTROL_INTERROGATE值。

但是,当服务控制处理程序没有对SERVICE_CONTROL_STOP控制代码做出反应时,是否存在问题?服务控制处理程序在这种情况下至少调用SetServiceStatus()时是否存在问题?

1 个答案:

答案 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;
    }
}