Escritura de una función de controlador de control

Cuando el subproceso distribuidor llama a una función Handler , controla el código de control pasado en el parámetro Opcode y, a continuación, llama a la función ReportSvcStatus para actualizar el estado del servicio. Cuando una función Handler recibe un código de control, debe notificar el estado del servicio solo si el control del código de control hace que el estado del servicio cambie. Si el servicio no actúa en el control, no debe notificar el estado al administrador de control de servicios. Para obtener el código fuente de ReportSvcStatus, consulte Escritura de una función ServiceMain.

En el ejemplo siguiente, la función SvcCtrlHandler es un ejemplo de una función Handler . Tenga en cuenta que la variable ghSvcStopEvent es una variable global que se debe inicializar y usar como se muestra en Escritura de una función 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;
   } 
   
}

Función de controlador de control de servicio

Ejemplo de servicio completo