Démarrage du service
Pour démarrer un service ou un service de pilote, le programme de contrôle des services utilise la fonction StartService . La fonction StartService échoue si la base de données est verrouillée. Dans ce cas, le programme de contrôle des services doit attendre quelques secondes et appeler à nouveau StartService . Il peut vérifier l’état de verrouillage actuel de la base de données en appelant la fonction QueryServiceLockStatus .
Si le programme de contrôle des services 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 valeur après qu’un nouveau thread a été créé pour exécuter la fonction ServiceMain . Le programme de contrôle de service peut récupérer l’état du service qui vient d’être démarré dans une structure d' _ État de service en appelant la fonction QueryServiceStatus . Pendant l’initialisation, le membre dwCurrentState doit être _ en attente de démarrage de service _ . Le membre dwWaitHint est un intervalle de temps, en millisecondes, qui indique la durée d’attente du programme de contrôle des services avant d’appeler à nouveau QueryServiceStatus . Une fois l’initialisation terminée, le service change dwCurrentState en service _ Running.
Le gestionnaire de contrôle des services 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 des services ne détecte pas les modifications apportées aux variables d’environnement lorsque 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 de ServiceMain .
Voici une vue d’ensemble simplifiée de ce qui se passe quand un service standard est démarré par le gestionnaire de contrôle des services :
- Le SCM lit le chemin d’accès du service à partir du Registre et prépare le démarrage du service. Cela comprend l’acquisition du verrou de service. Toute tentative de démarrage d’un autre service alors que le verrou de service est maintenu est 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 l’état d’exécution du SERVICE _ .
- L’application effectue son initialisation très simple et appelle la fonction StartServiceCtrlDispatcher .
- StartServiceCtrlDispatcher se connecte au gestionnaire de contrôle des services et démarre un deuxième thread qui appelle la fonction ServiceMain pour le service. La fonction ServiceMain doit signaler le service _ s’exécuter dès que possible.
- Quand le gestionnaire de contrôle des services est informé 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 un délai de 80 secondes, plus le dernier indicateur Wait, le gestionnaire de contrôle des services détermine que le service a cessé de répondre. Le gestionnaire de contrôle des services consigne un événement et arrête le service.
Si le programme démarre un service de pilote, StartService retourne une valeur une fois que le pilote de périphérique a terminé son initialisation.
Pour plus d’informations, consultez démarrage d’un service.