Transitions d’état du service

Un service est chargé de signaler les modifications de son état au gestionnaire de contrôle de service (SCM). Les programmes de contrôle de service et le système peuvent rechercher l’état d’un service uniquement à partir du SCM. Il est donc important qu’un service signale correctement son état. Un service signale son état en appelant la fonction SetServiceStatus avec un pointeur vers une structure SERVICE_STATUS entièrement initialisée. Le membre dwCurrentState de la structure contient l’état du service à signaler.

L’état initial d’un service est SERVICE_STOPPED. Lorsque le SCM démarre le service, il définit l’état du service sur SERVICE_START_PENDING et appelle la fonction ServiceMain du service. Le service termine ensuite son initialisation à l’aide de l’une des techniques décrites dans ServiceMain Function. Une fois que le service a terminé son initialisation et qu’il est prêt à commencer à recevoir des demandes de contrôle, le service appelle SetServiceStatus pour signaler SERVICE_RUNNING et spécifier les demandes de contrôle que le service est prêt à accepter. La transition de SERVICE_START_PENDING à SERVICE_RUNNING indique au SCM et aux outils de surveillance du service que le service a démarré avec succès. Si le service signale un état autre que SERVICE_RUNNING, le SCM ou les outils de surveillance du service peuvent marquer le service comme ayant échoué à démarrer.

Le SCM envoie uniquement les demandes de contrôle spécifiées au service (à l’exception de la requête SERVICE_CONTROL_INTERROGATE, qui est toujours envoyée). Pour obtenir la liste des demandes de contrôle qu’un service peut accepter, consultez le membre dwControlsAccepted de la structure SERVICE_STATUS . Pour plus d’informations sur l’inscription pour recevoir des événements d’appareil, consultez la fonction RegisterDeviceNotification .

L’état du service change généralement à la suite de la gestion d’une demande de contrôle. Les demandes de contrôle qui entraînent la modification de l’état du service incluent les SERVICE_CONTROL_STOP, les SERVICE_CONTROL_PAUSE et les SERVICE_CONTROL_CONTINUE. Si le service doit effectuer un traitement long pour gérer l’une de ces demandes, il doit créer un thread secondaire pour effectuer le traitement long et signaler l’état en attente correspondant au SCM. (Pour de meilleures performances sur Windows Vista et les versions ultérieures de Windows, le service doit utiliser un thread worker à partir d’un pool de threads à cet effet.) Le service doit ensuite signaler la transition d’état terminée lorsque le traitement long est terminé. Pour plus d’informations sur la gestion des demandes de contrôle, consultez Service Control Handler Function.

Seules certaines transitions d’état de service sont valides. Le diagramme suivant montre les transitions valides.

transitions de status de service valides

L’état du service signalé au SCM détermine la façon dont le SCM interagit avec le service. Par exemple, si un service signale SERVICE_STOP_PENDING, le SCM ne transmet pas d’autres demandes de contrôle au service, car cet état indique que le service s’arrête. L’état suivant signalé par le service doit être SERVICE_STOPPED, car il s’agit du seul état valide après SERVICE_STOP_PENDING. Toutefois, si un service signale une transition qui n’est pas valide, le SCM n’échoue pas à l’appel.

Le diagramme suivant montre plus en détail les transitions d’état du service, notamment les demandes de contrôle initiées par un programme de contrôle de service (le client de service) et les appels SetServiceStatus qu’un service effectue pour signaler les modifications d’état apportées au SCM. Comme mentionné précédemment, le SCM envoie uniquement les demandes de contrôle que le service a spécifié qu’il acceptera, de sorte qu’un service peut ne pas recevoir toutes les demandes indiquées dans le diagramme.

transitions status service en détail

ControlService

ControlServiceEx

SetServiceStatus