Funzione StartServiceW (winsvc.h)
Avvia un servizio.
Sintassi
BOOL StartServiceW(
[in] SC_HANDLE hService,
[in] DWORD dwNumServiceArgs,
[in, optional] LPCWSTR *lpServiceArgVectors
);
Parametri
[in] hService
Handle al servizio. Questo handle viene restituito dalla funzione OpenService o CreateService e deve avere il diritto di accesso SERVICE_START. Per altre informazioni, vedere Sicurezza del servizio e diritti di accesso.
[in] dwNumServiceArgs
Numero di stringhe nella matrice lpServiceArgVectors . Se lpServiceArgVectors è NULL, questo parametro può essere zero.
[in, optional] lpServiceArgVectors
Le stringhe con terminazione null da passare alla funzione ServiceMain per il servizio come argomenti. Se non sono presenti argomenti, questo parametro può essere NULL. In caso contrario, il primo argomento (lpServiceArgVectors[0]) è il nome del servizio, seguito da eventuali argomenti aggiuntivi (lpServiceArgVectors[1] tramite lpServiceArgVectors[dwNumServiceArgArgs-1]).
I servizi driver non ricevono questi argomenti.
Valore restituito
Se la funzione ha esito positivo, il valore restituito è diverso da zero.
Se la funzione ha esito negativo, il valore restituito è zero. Per informazioni dettagliate sull'errore, chiamare GetLastError.
I codici di errore seguenti possono essere impostati dal gestore di controllo del servizio. Altri possono essere impostati dalle funzioni del Registro di sistema chiamate dal gestore di controllo del servizio.
Codice restituito | Descrizione |
---|---|
|
L'handle non dispone del diritto di accesso SERVICE_START. |
|
Handle non valido. |
|
Impossibile trovare il file binario del servizio. |
|
Un'istanza del servizio è già in esecuzione. |
|
Il database è bloccato. |
|
Il servizio dipende da un servizio che non esiste o è stato contrassegnato per l'eliminazione. |
|
Il servizio dipende da un altro servizio che non è riuscito ad avviare. |
|
Il servizio è stato disabilitato. |
|
il servizio non è stato avviato a causa di un errore in fase di accesso. Questo errore si verifica se il servizio è configurato per l'esecuzione in un account che non dispone del diritto "Accedi come servizio". |
|
Il servizio è stato contrassegnato per l'eliminazione. |
|
Impossibile creare un thread per il servizio. |
|
Il processo per il servizio è stato avviato, ma non ha chiamato StartServiceCtrlDispatcher o il thread denominato StartServiceCtrlDispatcher può essere bloccato in una funzione del gestore di controllo. |
Commenti
Quando viene avviato un servizio driver, la funzione StartService non restituisce fino al termine dell'inizializzazione del driver del dispositivo.
Quando viene avviato un servizio, Service Control Manager (SCM) genera il processo di servizio, se necessario. Se il servizio specificato condivide un processo con altri servizi, il processo necessario può già esistere. La funzione StartService non attende il primo aggiornamento dello stato dal nuovo servizio, perché può richiedere un po' di tempo. Restituisce invece quando SCM riceve una notifica dal dispatcher del controllo del servizio che il thread ServiceMain per questo servizio è stato creato correttamente.
SCM imposta i valori di stato predefiniti seguenti prima di restituire da StartService:
- Lo stato corrente del servizio è impostato su SERVICE_START_PENDING.
- I controlli accettati sono impostati su nessuno (zero).
- Il valore CheckPoint è impostato su zero.
- L'ora WaitHint è impostata su 2 secondi.
Un servizio non può chiamare StartService durante l'inizializzazione. Il motivo è che SCM blocca il database di controllo del servizio durante l'inizializzazione, quindi una chiamata a StartService bloccherà. Dopo l'avvio del servizio, il servizio segnala a SCM che è stato avviato correttamente, può chiamare StartService.
Come per ControlService, StartService blocca per 30 secondi se qualsiasi servizio è occupato a gestire un codice di controllo. Se il servizio occupato non è ancora stato restituito dalla funzione del gestore alla scadenza del timeout, StartService ha esito negativo con ERROR_SERVICE_REQUEST_TIMEOUT. Questo è dovuto al fatto che SCM elabora una sola notifica di controllo del servizio alla volta.
Esempio
Per un esempio, vedere Avvio di un servizio.
Nota
L'intestazione winsvc.h definisce StartService come alias che seleziona automaticamente la versione ANSI o Unicode di questa funzione in base alla definizione della costante del preprocessore UNICODE. La combinazione dell'utilizzo dell'alias di codifica neutrale con il codice che non è neutrale dalla codifica può causare errori di corrispondenza che causano errori di compilazione o runtime. Per altre informazioni, vedere Convenzioni per i prototipi di funzione.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows XP [solo app desktop] |
Server minimo supportato | Windows Server 2003 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | winsvc.h (include Windows.h) |
Libreria | Advapi32.lib |
DLL | Advapi32.dll |