以下示例中的MyServiceCtrlHandler函数是处理器函数。当调度器线程调用此函数时,它处理在【操作码】参数中传递的控制代码,然后调用SetServiceStatus函数来更新服务状态。每当处理器函数接收到控制代码时,无论该服务是否作用在控件上,都可以通过调用SetServiceStatus返回状态。
当接收到暂停控制时,MyServiceCtrlHandler将SERVICE_STATUS结构中的【dwCurrentState】字段设置为SERVICE_PAUSED。同样,当接收到继续控制时,状态设置为SERVICE_RUNNING。因此,MyServiceCtrlHandler不是处理暂停和继续控制的好例子。因为MyServiceCtrlHandler是处理器函数的模板,所以包含暂停和继续控件的代码是为了完整。支持暂停或继续控制的服务应以有意义的方式处理这些控件。许多服务既不支持暂停或继续控制。如果服务指示不支持暂停或继续使用【dwControlsAccepted】参数,则SCM将不会向服务的处理器功能发送暂停或继续控制。
要输出调试信息,MyServiceCtrlHandler调用SvcDebugOut。源代码SvcDebugOut列在编写服务计划的主要功能中。
VOID MyServiceCtrlHandler(DWORD操作码)
{
DWORD status;
开关(操作码)
{
case SERVICE_CONTROL_PAUSE:
//做任何事情,暂停在这里。
MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
//做任何事情要继续这里。
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
//做任何事情要停止在这里。
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwCurrentState = SERVICE_STOPPED_PENDING;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
if(!SetServiceStatus(MyServiceStatusHandle,
&MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(“[MY_SERVICE] SetServiceStatus错误
%ld\n",status);
}
SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0);
return;
case SERVICE_CONTROL_INTERROGATE:
//通过发送当前状态。
break;
默认:
SvcDebugOut(“[MY_SERVICE]无法识别的操作码%ld \\ n”,
Opcode);
}
//发送当前状态。
if(!SetServiceStatus(MyServiceStatusHandle,& MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(“[MY_SERVICE] SetServiceStatus错误
%ld\n",status);
}
return;
}