Partilhar via


Escrevendo uma função de manipulador de controle

Quando uma funçãodo manipuladoré chamada pela thread do dispatcher, esta manipula o código de controlo passado no parâmetro Opcode e, em seguida, chama a função ReportSvcStatus para atualizar o estado do serviço. Quando uma função manipuladoraderecebe um código de controle, ela deve relatar o status do serviço somente se a manipulação do código de controle fizer com que o status do serviço seja alterado. Se o serviço não atuar no controle, ele não deve relatar o status ao gerente 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 como demonstrado em Escrevendo 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;
   } 
   
}

Função do manipulador de controle de serviço

O Exemplo de Serviço Completo