Diensteinstiegspunkt

Dienste werden in der Regel als Konsolenanwendungen geschrieben. Der Einstiegspunkt einer Konsolenanwendung ist die Standard-Funktion. Die funktion Standard 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 es die Funktion StartServiceCtrlDispatcher aufruft. Verwenden Sie die folgenden Richtlinien.

  • Ein Dienst vom Typ SERVICE_WIN32_OWN_PROCESS sollte StartServiceCtrlDispatcher sofort aus seinem Standard Thread aufrufen. Sie können eine beliebige Initialisierung nach dem Starten des Diensts durchführen, wie unter Service ServiceMain-Funktion beschrieben.
  • Wenn der Diensttyp SERVICE_WIN32_SHARE_PROCESS ist und eine gemeinsame Initialisierung für alle Dienste im Programm vorhanden ist, können Sie die Initialisierung im Standard Thread ausführen, bevor Sie StartServiceCtrlDispatcher aufrufen, solange dies weniger als 30 Sekunden dauert. Andernfalls müssen Sie einen anderen Thread erstellen, um die allgemeine Initialisierung durchzuführen, während der Standard Thread StartServiceCtrlDispatcher aufruft. Sie sollten auch nach dem Starten des Diensts eine dienstspezifische Initialisierung durchführen.

Die StartServiceCtrlDispatcher-Funktion verwendet eine SERVICE_TABLE_ENTRY-Struktur für jeden Dienst, der im Prozess enthalten ist. Jede Struktur gibt den Dienstnamen und den Einstiegspunkt für den Dienst an. Ein Beispiel finden Sie unter Schreiben der Standard-Funktion eines Dienstprogramms.

Wenn StartServiceCtrlDispatcher erfolgreich ist, wird der aufrufende Thread erst zurückgegeben, wenn alle ausgeführten Dienste im Prozess in den SERVICE_STOPPED Zustand versetzt wurden. Der SCM sendet Steuerungsanforderungen über eine Named Pipe an diesen Thread. Der Thread fungiert als Steuerungsverteiler 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.

Schreiben der Standard-Funktion eines Dienstprogramms