ControlService

【勇芳软件工作室】汉化HomePreviousNext

ControlService功能将控制代码发送到Win32服务。

BOOL ControlService(

SC_HANDLE 【hService】,//处理服务
DWORD 【dwControl】,//控制代码
LPSERVICE_STATUS 【lpServiceStatus】//指向服务状态结构的指针
); 

参数

【hService】

标识服务。该句柄由OpenServiceCreateService功能返回。此句柄所需的访问取决于所请求的【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功能要求服务控制管理器将请求的控制代码发送到服务。如果服务接受控制并且服务处于可控状态,则服务控制管理器发送代码。QueryServiceStatusControlService函数返回SERVICE_STATUS结构,其dwCurrentStatedwControlsAccepted成员指示正在运行的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