c++ - 无法停止服务并出现错误 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时才会出现此错误。当我尝试从任务管理器停止服务时,也会发生同样的错误。
什么会导致这种行为?
解决方案
每次调用都会SetServiceStatus()
告诉 SCM 控制您的服务准备接收的内容。可能您最后一次调用SetServiceStatus()
设置dwControlsAccepted
为 0 而不是正在运行的服务的合理值的掩码(SERVICE_ACCEPT_STOP
至少)。
更新您设置dwCurrentState
为的调用,SERVICE_RUNNING
以便dwControlsAccepted
包括SERVICE_ACCEPT_STOP
.
推荐阅读
- function - 在程序集中传递参数
- php - SQL 在日期或时间使用 where 子句过滤时间戳
- python - 如果二叉搜索树是二叉搜索树,分析代码
- php - 为什么我的间隙同时使用插入和更新?
- laravel - 无法读取空方法参数的属性替换
- amazon-web-services - Terraform aws_autoscaling_group 启动的 AWS EC2 实例的动态命名
- powerapps - PowerApps 和大数据量的分页
- javascript - 如何按数组字段值javascript对数组进行排序
- linux - 无法在 Debian 上安装 Telegram:ModuleNotFoundError: No module named 'apt_pkg'
- swift - 为什么 Apple 创建 isBatteryMonitoringEnabled?