编写控制处理函数

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

以下示例中的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;

}