服务程序的主要功能是调用StartServiceCtrlDispatcher函数来连接到SCM并启动控制分派器线程。调度程序线程循环,等待调度表中指定的服务的传入控制请求。这个线程在出现错误或进程中的所有服务都已终止之前不返回。当进程中的所有服务终止时,SCM向调度程序线程发送一个控制请求,告诉它关闭。线程然后可以从StartServiceCtrlDispatcher调用返回,并且进程可以终止。
以下示例是仅支持一个服务的服务进程。它需要两个参数:一个字符串,可以包含一个格式化的输出字符和一个数字值用作格式化的字符。SvcDebugOut函数将信息消息和错误打印到调试器。
SERVICE_STATUS MyServiceStatus;
SERVICE_STATUS_HANDLE MyServiceStatusHandle;
VOID MyServiceStart (DWORD argc, LPTSTR *argv);
VOID MyServiceCtrlHandler (DWORD opcode);
DWORD MyServiceInitialization(DWORD argc,LPTSTR * argv,
DWORD *specificError);
VOID _CRTAPI1 main()
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{TEXT(“MyService”),MyServiceStart},
{ NULL, NULL }
};
if(!StartServiceCtrlDispatcher(DispatchTable))
{
SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error =
%d\n", GetLastError());
}
}
VOID SvcDebugOut(LPSTR String,DWORD Status)
{
CHAR Buffer[1024];
if(strlen(String)< 1000)
{
sprintf(Buffer, String, Status);
OutputDebugStringA(Buffer);
}
}
如果您的服务程序支持多个服务,主要功能的实现将略有不同。附加服务的名称应该添加到dispatch表中,以便它们可以被调度程序线程监视。