以下示例使用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;
}