Point d’entrée de service

Les services sont généralement écrits en tant qu’applications console. Le point d’entrée d’une application console est sa fonction main. La fonction main reçoit les arguments de la valeur ImagePath de la clé de Registre pour le service. Pour plus d’informations, consultez la section Notes de la fonction CreateService .

Lorsque le SCM démarre un programme de service, il attend qu’il appelle la fonction StartServiceCtrlDispatcher . Suivez les instructions suivantes.

  • Un service de type SERVICE_WIN32_OWN_PROCESS doit appeler immédiatement StartServiceCtrlDispatcher à partir de son thread main. Vous pouvez effectuer n’importe quelle initialisation après le démarrage du service, comme décrit dans ServiceMain Function.
  • Si le type de service est SERVICE_WIN32_SHARE_PROCESS et qu’il existe une initialisation commune pour tous les services du programme, vous pouvez effectuer l’initialisation dans le thread main avant d’appeler StartServiceCtrlDispatcher, à condition que cela prenne moins de 30 secondes. Sinon, vous devez créer un autre thread pour effectuer l’initialisation courante, tandis que le thread main appelle StartServiceCtrlDispatcher. Vous devez toujours effectuer toute initialisation spécifique au service après le démarrage du service.

La fonction StartServiceCtrlDispatcher prend une structure SERVICE_TABLE_ENTRY pour chaque service contenu dans le processus. Chaque structure spécifie le nom du service et le point d’entrée du service. Pour obtenir un exemple, consultez Writing a Service Program’s main Function.

Si StartServiceCtrlDispatcher réussit, le thread appelant ne retourne pas tant que tous les services en cours d’exécution dans le processus n’ont pas entré l’état SERVICE_STOPPED. Le SCM envoie des demandes de contrôle à ce thread via un canal nommé. Le thread agit en tant que répartiteur de contrôle, en effectuant les tâches suivantes :

  • Créez un thread pour appeler le point d’entrée approprié lors du démarrage d’un nouveau service.
  • Appelez la fonction de gestionnaire appropriée pour gérer les demandes de contrôle de service.

Écriture de la fonction main d’un programme de service