Transitions d’état de service

Un service est chargé de signaler les modifications de son état au gestionnaire de contrôle des services (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 d' _ État de service entièrement initialisée. Le membre dwCurrentState de la structure contient l’état du service à signaler.

L’état initial d’un service est _ arrêté. Lorsque le SCM démarre le service, il définit l’état du service sur _ attente du démarrage du service _ et appelle la fonction ServiceMain du service. Le service termine ensuite son initialisation à l’aide de l’une des techniques décrites dans la fonction service ServiceMain. Une fois que le service a terminé son initialisation et est prêt à commencer à recevoir des demandes de contrôle, le service appelle SetServiceStatus pour signaler le service d' _ exécution et spécifie les demandes de contrôle que le service est prêt à accepter. La transition du démarrage du SERVICE _ _ en attente au service _ en cours d’exécution indique aux outils SCM et de surveillance des services que le service a démarré avec succès. Si le service signale un État autre que SERVICE _ en cours d’exécution, les outils SCM ou d’analyse de service peuvent signaler que le service n’a pas pu démarrer.

Le SCM envoie uniquement les demandes de contrôle spécifiées au service (à l’exception de la _ demande d’interrogation de contrôle de service _ , 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 d' _ État du service . 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 suite à la gestion d’une demande de contrôle. Les demandes de contrôle qui provoquent le changement de l’état du service incluent l’arrêt du contrôle de SERVICE _ , la suspension du contrôle du _ service et la poursuite du contrôle du _ _ service _ _ . Si le service doit effectuer un traitement de longue durée pour gérer l’une de ces demandes, il doit créer un thread secondaire pour effectuer le traitement long et signaler l’état d’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 de l’état terminé lorsque le traitement long est terminé. Pour plus d’informations sur la gestion des demandes de contrôle, consultez fonction du gestionnaire de contrôle des services.

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 des rapports de service s' _ arrête _ en attente, le SCM ne transmet pas d’autres demandes de contrôle au service, car cet État indique que le service est en cours d’arrêt. L’état suivant signalé par le service doit être _ arrêté, car il s’agit du seul État valide après l’arrêt du service _ _ en attente. 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, y compris 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 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, donc un service risque de ne pas recevoir toutes les demandes présentées dans le diagramme.

transitions d’état de service en détail

ControlService

ControlServiceEx

SetServiceStatus