ControlService功能将控制代码发送到Win32服务。
BOOL ControlService(
SC_HANDLE 【hService】, | //处理服务 |
DWORD 【dwControl】, | //控制代码 |
LPSERVICE_STATUS 【lpServiceStatus】 | //指向服务状态结构的指针 |
); |
参数
【hService】
标识服务。该句柄由OpenService或CreateService功能返回。此句柄所需的访问取决于所请求的【dwControl】代码。
【dwControl】
指定所请求的控制代码。该值可以是表中的标准控制代码之一,也可以是128到255范围内的用户定义的控制代码。对于用户定义的控制代码,【hService】句柄必须具有SERVICE_USER_DEFINED_CONTROL访问权限,并且该服务定义与控制代码相关联的操作。
值 | 含义 | ||||
SERVICE_CONTROL_STOP | |||||
请求服务停止。【hService】句柄必须具有SERVICE_STOP访问权限。 | |||||
SERVICE_CONTROL_PAUSE | |||||
请求服务暂停。【hService】句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 | |||||
SERVICE_CONTROL_CONTINUE | |||||
请求暂停的服务恢复。【hService】句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 | |||||
SERVICE_CONTROL_INTERROGATE | |||||
请求服务立即更新其当前状态信息到服务控制管理器。【hService】句柄必须具有SERVICE_INTERROGATE权限。 | |||||
SERVICE_CONTROL_SHUTDOWN | |||||
如果指定了此控制代码,则ControlService函数将失败。 |
【lpServiceStatus】
指向返回服务的最新状态信息的SERVICE_STATUS结构。返回的信息反映了该服务向服务控制经理报告的最新状态。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
错误
服务控制管理器可以设置以下错误代码。其他错误代码可以由服务控制管理器调用的注册表函数设置。
值 | 含义 | ||||
ERROR_ACCESS_DENIED | |||||
指定的句柄未被打开,必要的访问。 | |||||
ERROR_DEPENDENT_SERVICES_RUNNING | |||||
该服务不能停止,因为其他运行的服务依赖于它。 | |||||
ERROR_INVALID_SERVICE_CONTROL | |||||
请求的控制代码无效,或者服务不可接受。 | |||||
ERROR_SERVICE_CANNOT_ACCEPT_CTRL | |||||
请求的控制代码不能发送到服务,因为服务的状态是SERVICE_STOPPED,SERVICE_START_PENDING或SERVICE_STOP_PENDING。 | |||||
ERROR_SERVICE_NOT_ACTIVE | |||||
该服务尚未启动。 | |||||
ERROR_SERVICE_REQUEST_TIMEOUT | |||||
该服务没有及时响应启动请求。 |
备注
ControlService功能要求服务控制管理器将请求的控制代码发送到服务。如果服务接受控制并且服务处于可控状态,则服务控制管理器发送代码。QueryServiceStatus或ControlService函数返回SERVICE_STATUS结构,其dwCurrentState和dwControlsAccepted成员指示正在运行的Win32服务接受的当前状态和控件。
默认情况下,所有运行的服务都接受SERVICE_CONTROL_INTERROGATE控制代码。每个服务指定当它调用SetServiceStatus函数来报告其状态时接受的其他控制代码。
下表显示了服务控制管理器在每个可能的服务状态中的操作:
服务状态 | 停止 | 其他控件 |
STOPPED | (c) | (c) |
STOP_PENDING | (b) | (b) |
START_PENDING | (a) | (b) |
RUNNING | (a) | (a) |
CONTINUE_PENDING | (a) | (a) |
PAUSE_PENDING | (a) | (a) |
PAUSED | (a) | (a) |
(a)如果服务接受该控制代码,请将该请求发送给服务;否则,ControlService返回FALSE,GetLastError返回ERROR_INVALID_SERVICE_CONTROL。 | |||||||||||||||||||||
(b)服务不可控状态,ControlService返回FALSE,GetLastError返回ERROR_SERVICE_CANNOT_ACCEPT_CTRL。 | |||||||||||||||||||||
(c)服务不是可控状态,所以ControlService返回FALSE,GetLastError返回ERROR_SERVICE_NOT_ACTIVE。 |
也可以看看
CreateService, OpenService, QueryServiceStatus, SetServiceStatus, SERVICE_STATUS