向服务发送控制请求

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

以下示例使用ControlService函数将控制值发送到正在运行的服务。不同的控制值需要访问服务对象的不同级别。例如,服务对象句柄必须具有SERVICE_STOP访问权才能发送SERVICE_CONTROL_STOP代码。当ControlService返回时,SERVICE_STATUS结构包含该服务的最新状态信息。

VOID ControlSampleService(DWORD fdwControl)

{

SERVICE_STATUS ssStatus;

DWORD fdwAccess;

//所需的服务对象访问取决于控件。

开关(fdwControl)

{

case SERVICE_CONTROL_STOP:

fdwAccess = SERVICE_STOP;

break;

case SERVICE_CONTROL_PAUSE:

case SERVICE_CONTROL_CONTINUE:

fdwAccess = SERVICE_PAUSE_CONTINUE;

break;

case SERVICE_CONTROL_INTERROGATE:

fdwAccess = SERVICE_INTERROGATE;

break;

默认:

fdwAccess = SERVICE_INTERROGATE;

}

//打开服务的句柄。

schService = OpenService(

schSCManager, // SCManager数据库

TEXT("Sample_Srv"), //服务名称

fdwAccess); //指定访问

if (schService == NULL)

MyErrorExit("OpenService");

//发送控件值给服务。

if(!ControlService(

schService, //处理服务

fdwControl, //控制值发送

&ssStatus) ) //状态信息的地址

{

MyErrorExit("ControlService");

}

//打印服务状态。

printf("\nStatus of Sample_Srv: \n");

printf(" Service Type: 0x%x\n", ssStatus.dwServiceType);

printf(" Current State: 0x%x\n", ssStatus.dwCurrentState);

printf(“Controls Accepted:0x%x \\ n”,

ssStatus.dwControlsAccepted);

printf(" Exit Code: %d\n", ssStatus.dwWin32ExitCode);

printf(“服务特定退出代码:%d \\ n”,

ssStatus.dwServiceSpecificExitCode);

printf(" Check Point: %d\n", ssStatus.dwCheckPoint);

printf(" Wait Hint: %d\n", ssStatus.dwWaitHint);

return;

}