【发布时间】:2011-12-11 09:17:20
【问题描述】:
如何从 C/C++ 程序更改 Windows 服务的当前状态?
例如,Mysql 作为服务运行,其当前状态为“已启动”...如何检查状态以及如何从 c/c++ 程序更改其状态?就像我想将其状态从“已启动”更改为“已停止” - 我如何在 c/c++ 中做到这一点?
【问题讨论】:
-
这更像是一个 WinAPI 问题而不是 C++ 问题...
如何从 C/C++ 程序更改 Windows 服务的当前状态?
例如,Mysql 作为服务运行,其当前状态为“已启动”...如何检查状态以及如何从 c/c++ 程序更改其状态?就像我想将其状态从“已启动”更改为“已停止” - 我如何在 c/c++ 中做到这一点?
【问题讨论】:
QueryServiceStatus 可用于确定服务的状态。
查看其他Service functions 更改状态。甚至还有一个完整的 Starting a Service 示例(以及匹配的 Stopping a Service 代码)。
【讨论】:
一个可以帮助您入门的小代码 sn-p:
/* Open service control manager. */
SC_HANDLE scm_handle = OpenSCManager(0,
0,
SC_MANAGER_ALL_ACCESS);
/* Ensure (0 != scm_handle) */
/* Open service. */
SC_HANDLE service_handle = OpenService(scm_handle,
"mysql-service-name",
SERVICE_ALL_ACCESS);
/* Ensure (0 != service_handle) */
/* Try to stop the service if it is running. */
SERVICE_STATUS status; /* This may need populated differently for mysql. */
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
if (ControlService(service_handle, SERVICE_CONTROL_STOP, &status))
{
Sleep(1000);
while (QueryServiceStatus(service_handle, &status))
{
if(status.dwCurrentState == SERVICE_STOP_PENDING)
{
Sleep(1000);
}
else
{
break;
}
}
if (status.dwCurrentState == SERVICE_STOPPED)
{
/* Success: service stopped. */
}
else
{
/* Failure: service not stopped. */
}
}
else
{
/* Failed to issue stop request. */
}
CloseServiceHandle(service_handle);
CloseServiceHandle(scm_handle);
【讨论】: