Partager via


Transitions d’état du service

Un service est chargé de signaler les modifications apportées à son état au gestionnaire de contrôle de service (SCM). Les programmes de contrôle de service et le système peuvent déterminer l’état d’un service uniquement à partir du SCM. Il est donc important qu’un service signale son état correctement. Un service signale son état en appelant la fonction SetServiceStatus avec un pointeur vers une structure de SERVICE_STATUS entièrement initialisée. Le dwCurrentState membre 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 fonction ServiceMain. Une fois que le service a terminé son initialisation et qu’il est prêt à 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 aux outils SCM et de surveillance des services que le service a démarrés avec succès. Si le service signale un état autre que SERVICE_RUNNING, les outils de surveillance du service ou SCM 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 demande de SERVICE_CONTROL_INTERROGATE, qui est toujours envoyée). Pour obtenir la liste des demandes de contrôle qu’un service peut accepter, consultez la dwControlsAccepted membre 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 en raison 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 des SERVICE_CONTROL_STOP, des SERVICE_CONTROL_PAUSE et des 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 des performances optimales sur Windows Vista et les versions ultérieures de Windows, le service doit utiliser un thread de travail à 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 fonction de gestionnaire de contrôle de service.

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

transitions d’état 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 de demandes de contrôle supplémentaires au service, car cet état indique que le service est arrêté. L’état suivant signalé par le service doit être SERVICE_STOPPED, car il s’agit de l’état valide uniquement 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 les transitions d’état de service plus en détail, notamment les demandes de contrôle lancé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 au SCM. Comme mentionné précédemment, le SCM envoie uniquement les demandes de contrôle que le service a spécifiées qu’il acceptera. Par conséquent, un service peut ne pas recevoir toutes les demandes affichées dans le diagramme.

transitions d’état du service en détail

ControlService

ControlServiceEx

setServiceStatus