Diensteinstiegspunkt
Dienste werden im Allgemeinen als Konsolenanwendungen geschrieben. Der Einstiegspunkt einer Konsolenanwendung ist die Hauptfunktion. Die main-Funktion empfängt Argumente vom ImagePath-Wert aus dem Registrierungsschlüssel für den Dienst. Weitere Informationen finden Sie im Abschnitt "Hinweise" der CreateService-Funktion.
Wenn der SCM ein Dienstprogramm startet, wartet er darauf, dass er die Funktion StartServiceCtrlDispatcher aufruft. Befolgen Sie die folgenden Richtlinien.
- Ein Dienst vom Typ SERVICE _ WIN32 _ OWN PROCESS sollte _ StartServiceCtrlDispatcher sofort über seinen Hauptthread aufrufen. Sie können eine beliebige Initialisierung nach dem Start des Diensts ausführen, wie unter Service ServiceMain-Funktionbeschrieben.
- Wenn der Diensttyp SERVICE _ WIN32 SHARE PROCESS lautet und es eine allgemeine _ _ Initialisierung für alle Dienste im Programm gibt, können Sie die Initialisierung im Hauptthread ausführen, bevor Sie StartServiceCtrlDispatcheraufrufen, sofern dies weniger als 30 Sekunden dauert. Andernfalls müssen Sie einen anderen Thread erstellen, um die allgemeine Initialisierung durchzuführen, während der Hauptthread StartServiceCtrlDispatcher aufruft. Sie sollten nach dem Start des Diensts weiterhin eine dienstspezifische Initialisierung durchführen.
Die StartServiceCtrlDispatcher-Funktion übernimmt eine SERVICE TABLE _ _ ENTRY-Struktur für jeden im Prozess enthaltenen Dienst. Jede -Struktur gibt den Dienstnamen und den Einstiegspunkt für den Dienst an. Ein Beispiel finden Sie unter Schreiben der Hauptfunktion eines Dienstprogramms.
Wenn StartServiceCtrlDispatcher erfolgreich ist, gibt der aufrufende Thread erst dann zurück, wenn alle ausgeführten Dienste im Prozess den Status SERVICE STOPPED erreicht _ haben. Der SCM sendet Über eine Benannte Pipe Steuerungsanforderungen an diesen Thread. Der Thread fungiert als Steuerungsdisponent und führt die folgenden Aufgaben aus:
- Erstellen Sie einen neuen Thread, um den entsprechenden Einstiegspunkt aufzurufen, wenn ein neuer Dienst gestartet wird.
- Rufen Sie die entsprechende Handlerfunktion auf, um Dienststeuerungsanforderungen zu verarbeiten.