C语言 在服务的控制处理程序中实现了哪些控制代码



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

最新更新