【问题标题】:Can't stop the service with error ERROR_SERVICE_CANNOT_ACCEPT_CTRL无法停止服务并出现错误 ERROR_SERVICE_CANNOT_ACCEPT_CTRL
【发布时间】:2023-03-29 07:54:01
【问题描述】:

我正在尝试编写一个 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。 当我尝试从任务管理器停止服务时,也会发生同样的错误。

什么会导致这种行为?

【问题讨论】:

  • 服务处理SERVICE_CONTROL_STOP的问题
  • GetLastError 的返回值在您调用它时毫无意义。请仔细阅读documentation

标签: c++ winapi


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多