Gravando uma função de manipulador de controle
Quando uma função Handler é chamada pelo thread do dispatcher, ela manipula o código de controle passado no parâmetro Opcode e, em seguida, chama a função ReportSvcStatus para atualizar o serviço status. Quando uma função Handler recebe um código de controle, ela deve relatar o serviço status somente se a manipulação do código de controle fizer com que o serviço status seja alterado. Se o serviço não agir no controle, ele não deverá relatar status ao gerenciador de controle de serviço. Para obter o código-fonte de ReportSvcStatus, consulte Escrevendo uma função ServiceMain.
No exemplo a seguir, a função SvcCtrlHandler é um exemplo de uma função Handler . Observe que a variável ghSvcStopEvent é uma variável global que deve ser inicializada e usada conforme demonstrado em Escrever uma função ServiceMain.
//
// Purpose:
// Called by SCM whenever a control code is sent to the service
// using the ControlService function.
//
// Parameters:
// dwCtrl - control code
//
// Return value:
// None
//
VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
{
// Handle the requested control code.
switch(dwCtrl)
{
case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
// Signal the service to stop.
SetEvent(ghSvcStopEvent);
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
}
Tópicos relacionados