首页 > 解决方案 > 无法停止服务并出现错误 ERROR_SERVICE_CANNOT_ACCEPT_CTRL

问题描述

我正在尝试编写一个 Windows 服务应用程序,它运行得很好,但是当我尝试停止它时会发生奇怪的事情。

if (!ControlService(
    service,
    SERVICE_CONTROL_STOP,
    (LPSERVICE_STATUS)&ssp))
{
    //TODO: Log that can not send service a stop signal
    std::cout << ssp.dwCurrentState << std::endl;
    std::cout << GetLastError();
    CloseServiceHandle(service);
    CloseServiceHandle(SCManager);
    return false;
}

那个GetLastError()显示ERROR_SERVICE_CANNOT_ACCEPT_CTRL(1061)错误码,MSDN说只有当进程状态为SERVICE_STOPPED、SERVICE_START_PENDING或SERVICE_STOP_PENDING,但ssp.dwCurrentState为SERVICE_RUNNING时才会出现此错误。当我尝试从任务管理器停止服务时,也会发生同样的错误。

什么会导致这种行为?

标签: c++winapi

解决方案


每次调用都会SetServiceStatus()告诉 SCM 控制您的服务准备接收的内容。可能您最后一次调用SetServiceStatus()设置dwControlsAccepted为 0 而不是正在运行的服务的合理值的掩码(SERVICE_ACCEPT_STOP至少)。

更新您设置dwCurrentState为的调用,SERVICE_RUNNING以便dwControlsAccepted包括SERVICE_ACCEPT_STOP.


推荐阅读