Partager via


Démarrage du service

Pour démarrer un service ou un service de pilote, le programme de contrôle de service utilise la fonction StartService. La fonction StartService échoue si la base de données est verrouillée. Si cela se produit, le programme de contrôle de service doit attendre quelques secondes et appeler StartService à nouveau. Il peut vérifier l’état actuel du verrou de la base de données en appelant la fonction QueryServiceLockStatus.

Si le programme de contrôle de service démarre un service, il peut utiliser la fonctionStartServicepour spécifier un tableau d’arguments à passer à la fonction ServiceMain du service. La fonction StartService retourne une fois qu’un nouveau thread est créé pour exécuter la fonction ServiceMain. Le programme de contrôle de service peut récupérer l’état du service nouvellement démarré dans une structure SERVICE_STATUS en appelant la fonction QueryServiceStatus. Lors de l’initialisation, le membre dwCurrentState doit être SERVICE_START_PENDING. Le membre dwWaitHint est un intervalle de temps, en millisecondes, qui indique la durée pendant laquelle le programme de contrôle de service doit attendre avant d’appeler QueryServiceStatus. Une fois l’initialisation terminée, le service change dwCurrentState à SERVICE_RUNNING.

Le gestionnaire de contrôle de service ne prend pas en charge le passage de variables d’environnement personnalisées à un service au démarrage. En outre, le gestionnaire de contrôle de service ne détecte pas et ne transmet pas les modifications apportées aux variables d’environnement à mesure que le service est en cours d’exécution. Au lieu de rendre un service dépendant d’une variable d’environnement, utilisez des valeurs de Registre ou Arguments ServiceMain.

Voici une vue d’ensemble simplifiée de ce qui se passe lorsqu’un service classique est démarré par le gestionnaire de contrôle de service :

  • Le SCM lit le chemin du service à partir du Registre et prépare le démarrage du service. Cela inclut l’acquisition du verrou de service. Toute tentative de démarrage d’un autre service pendant que le verrou de service est conservé bloque jusqu’à ce que le verrou de service soit libéré.
  • Le SCM démarre le processus et attend que le processus enfant quitte (indiquant un échec) ou signale l’état SERVICE_RUNNING.
  • L’application effectue son initialisation très simple et appelle la fonction StartServiceCtrlDispatcher.
  • StartServiceCtrlDispatcher se connecte au gestionnaire de contrôle de service et démarre un deuxième thread qui appelle la fonctionServiceMainpour le service. ServiceMain doit signaler SERVICE_RUNNING dès que possible.
  • Lorsque le gestionnaire de contrôle de service est averti que le service est en cours d’exécution, il libère le verrou de service.

Si le service ne met pas à jour son état dans les 80 secondes, plus le dernier indicateur d’attente, le gestionnaire de contrôle de service détermine que le service a cessé de répondre. Le gestionnaire de contrôle de service enregistre un événement et arrête le service.

Si le programme démarre un service de pilote, StartService retourne une fois que le pilote de périphérique a terminé son initialisation.

Pour plus d’informations, consultez Démarrage d’un service.