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 à nouveau StartService . Il peut case activée le verrou actuel status 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 fonction StartService pour 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 les status du service nouvellement démarré dans une structure de SERVICE_STATUS en appelant la fonction QueryServiceStatus. Pendant 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 à nouveau QueryServiceStatus . Une fois l’initialisation terminée, le service change dwCurrentState en SERVICE_RUNNING.

Le gestionnaire de contrôle de service ne prend pas en charge la transmission 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 au fur et à 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 des arguments ServiceMain .

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

  • Le SCM lit le chemin du service à partir du Registre et se prépare au 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 maintenu sera bloquée jusqu’à ce que le verrou de service soit libéré.
  • Le SCM démarre le processus et attend que le processus enfant se termine (indiquant un échec) ou signale le SERVICE_RUNNING status.
  • 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 fonction ServiceMain pour 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 du service.

Si le service ne met pas à jour son status 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 consigne 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.