StartServiceA-Funktion (winsvc.h)
Startet einen Dienst.
Syntax
BOOL StartServiceA(
[in] SC_HANDLE hService,
[in] DWORD dwNumServiceArgs,
[in, optional] LPCSTR *lpServiceArgVectors
);
Parameter
[in] hService
Ein Handle für den Dienst. Dieses Handle wird von der OpenService - oder CreateService-Funktion zurückgegeben und muss über das SERVICE_START-Zugriffsrecht verfügen. Weitere Informationen finden Sie unter Dienstsicherheit und Zugriffsrechte.
[in] dwNumServiceArgs
Die Anzahl der Zeichenfolgen im LpServiceArgVectors-Array . Wenn lpServiceArgVectors NULL ist, kann dieser Parameter null sein.
[in, optional] lpServiceArgVectors
Die NULL-beendeten Zeichenfolgen, die an die ServiceMain-Funktion für den Dienst als Argumente übergeben werden sollen. Wenn keine Argumente vorhanden sind, kann dieser Parameter NULL sein. Andernfalls ist das erste Argument (lpServiceArgVectors[0]) der Name des Diensts, gefolgt von allen zusätzlichen Argumenten (lpServiceArgVectors[1] bis lpServiceArgVectors[dwNumServiceArgs-1]).
Treiberdienste erhalten diese Argumente nicht.
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.
Wenn die Funktion fehlerhaft ist, ist der Rückgabewert null. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.
Die folgenden Fehlercodes können vom Dienststeuerungs-Manager festgelegt werden. Andere können von den Registrierungsfunktionen festgelegt werden, die vom Dienststeuerungs-Manager aufgerufen werden.
Rückgabecode | Beschreibung |
---|---|
|
Das Handle verfügt nicht über das Zugriffsrecht SERVICE_START. |
|
Das Handle ist ungültig. |
|
Die Binärdatei des Diensts wurde nicht gefunden. |
|
Eine Instanz des Diensts wird bereits ausgeführt. |
|
Die Datenbank ist gesperrt. |
|
Der Dienst hängt von einem Dienst ab, der nicht vorhanden ist oder zum Löschen markiert wurde. |
|
Der Dienst hängt von einem anderen Dienst ab, der nicht gestartet werden konnte. |
|
Der Dienst wurde deaktiviert. |
|
Der Dienst konnte wegen einer fehlerhaften Anmeldung nicht gestartet werden. Dieser Fehler tritt auf, wenn der Dienst für die Ausführung unter einem Konto konfiguriert ist, das nicht über das Recht "Als Dienst anmelden" verfügt. |
|
Der Dienst wurde zum Löschen markiert. |
|
Für den Dienst konnte kein Thread erstellt werden. |
|
Der Prozess für den Dienst wurde gestartet, aber er hat nicht StartServiceCtrlDispatcher aufgerufen, oder der Thread, der StartServiceCtrlDispatcher aufgerufen hat, kann in einer Steuerelementhandlerfunktion blockiert werden. |
Hinweise
Wenn ein Treiberdienst gestartet wird, wird die StartService-Funktion erst zurückgegeben, wenn der Gerätetreiber die Initialisierung abgeschlossen hat.
Wenn ein Dienst gestartet wird, führt der Dienststeuerungs-Manager (SCM) ggf. den Dienstprozess aus. Wenn der angegebene Dienst einen Prozess für andere Dienste gemeinsam verwendet, ist der erforderliche Prozess möglicherweise bereits vorhanden. Die StartService-Funktion wartet nicht auf die erste status Aktualisierung des neuen Diensts, da dies eine Weile dauern kann. Stattdessen wird zurückgegeben, wenn der SCM vom Dienststeuerungsverteiler eine Benachrichtigung erhält, dass der ServiceMain-Thread für diesen Dienst erfolgreich erstellt wurde.
Der SCM legt die folgenden Standardwerte status fest, bevor von StartService zurückgegeben wird:
- Der aktuelle Status des Diensts ist auf SERVICE_START_PENDING festgelegt.
- Akzeptierte Steuerelemente sind auf keine (null) festgelegt.
- Der CheckPoint-Wert ist auf 0 (null) festgelegt.
- Die WaitHint-Zeit ist auf 2 Sekunden festgelegt.
Ein Dienst kann StartService während der Initialisierung nicht aufrufen. Der Grund dafür ist, dass der SCM die Dienststeuerungsdatenbank während der Initialisierung sperrt, sodass ein Aufruf von StartService blockiert wird. Nachdem der Dienst dem SCM gemeldet hat, dass er erfolgreich gestartet wurde, kann er StartService aufrufen.
Wie bei ControlService wird StartService für 30 Sekunden blockiert, wenn ein Dienst mit der Verarbeitung eines Steuerelementcodes beschäftigt ist. Wenn der ausgelastete Dienst immer noch nicht von seiner Handlerfunktion zurückgegeben wurde, wenn das Timeout abläuft, schlägt StartService mit ERROR_SERVICE_REQUEST_TIMEOUT fehl. Dies liegt daran, dass das SCM jeweils nur eine Dienststeuerungsbenachrichtigung verarbeitet.
Beispiele
Ein Beispiel finden Sie unter Starten eines Diensts.
Hinweis
Der winsvc.h-Header definiert StartService als Alias, der die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante automatisch auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit Code, der nicht Codierungsneutral ist, kann zu Nichtübereinstimmungen führen, die zu Kompilierungs- oder Laufzeitfehlern führen. Weitere Informationen finden Sie unter Konventionen für Funktionsprototypen.
Anforderungen
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | winsvc.h (windows.h einschließen) |
Bibliothek | Advapi32.lib |
DLL | Advapi32.dll |