Partager via


Écriture d’une fonction de gestionnaire de contrôles

Lorsqu’une fonction de gestionnaire est appelée par le thread de répartiteur, elle gère le code de contrôle transmis dans le paramètre Opcode, puis appelle la fonction ReportSvcStatus pour mettre à jour le service status. Lorsqu’une fonction de gestionnaire reçoit un code de contrôle, elle doit signaler le service status uniquement si la gestion du code de contrôle entraîne la modification du status du service. Si le service n’agit pas sur le contrôle, il ne doit pas signaler status au gestionnaire de contrôle de service. Pour obtenir le code source pour ReportSvcStatus, consultez Écriture d’une fonction ServiceMain.

Dans l’exemple suivant, la fonction SvcCtrlHandler est un exemple de fonction Handler . Notez que la variable ghSvcStopEvent est une variable globale qui doit être initialisée et utilisée comme indiqué dans Écriture d’une fonction 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;
   } 
   
}

Fonction du gestionnaire de contrôle des services

Exemple de service complet