Condividi tramite


Avvio del servizio

Per avviare un servizio o un servizio driver, il programma di controllo del servizio usa la funzione StartService . La funzione StartService ha esito negativo se il database è bloccato. In questo caso, il programma di controllo del servizio deve attendere alcuni secondi e chiamare di nuovo StartService . Può controllare lo stato corrente del blocco del database chiamando la funzione QueryServiceLockStatus .

Se il programma di controllo del servizio sta avviando un servizio, può usare la funzione StartService per specificare una matrice di argomenti da passare alla funzione ServiceMain del servizio. La funzione StartService viene restituita dopo la creazione di un nuovo thread per eseguire la funzione ServiceMain . Il programma di controllo del servizio può recuperare lo stato del servizio appena avviato in una struttura SERVICE_STATUS chiamando la funzione QueryServiceStatus . Durante l'inizializzazione, il membro dwCurrentState deve essere SERVICE_START_PENDING. Il membro dwWaitHint è un intervallo di tempo, in millisecondi, che indica quanto tempo deve attendere il programma di controllo del servizio prima di chiamare di nuovo QueryServiceStatus . Al termine dell'inizializzazione, il servizio cambia dwCurrentState in SERVICE_RUNNING.

Gestione controllo del servizio non supporta il passaggio di variabili di ambiente personalizzate a un servizio all'avvio. Inoltre, il gestore del controllo del servizio non rileva e passa le modifiche alle variabili di ambiente durante l'esecuzione del servizio. Anziché rendere un servizio dipendente da una variabile di ambiente, usare i valori del Registro di sistema o gli argomenti ServiceMain .

Di seguito è riportata una panoramica semplificata di ciò che accade quando un servizio tipico viene avviato dal gestore del controllo del servizio:

  • SCM legge il percorso del servizio dal Registro di sistema e prepara l'avvio del servizio. Ciò include l'acquisizione del blocco del servizio. Qualsiasi tentativo di avviare un altro servizio mentre il blocco del servizio viene bloccato fino al rilascio del blocco del servizio.
  • SCM avvia il processo e attende fino all'uscita del processo figlio (che indica un errore) o segnala lo stato di SERVICE_RUNNING.
  • L'applicazione esegue la sua inizializzazione molto semplice e chiama la funzione StartServiceCtrlDispatcher .
  • StartServiceCtrlDispatcher si connette alla gestione controllo del servizio e avvia un secondo thread che chiama la funzione ServiceMain per il servizio. ServiceMain deve segnalare SERVICE_RUNNING il prima possibile.
  • Quando il gestore del controllo del servizio riceve una notifica che il servizio è in esecuzione, rilascia il blocco del servizio.

Se il servizio non aggiorna lo stato entro 80 secondi, più l'ultimo hint di attesa, il gestore del controllo del servizio determina che il servizio ha interrotto la risposta. Gestione controllo del servizio registra un evento e arresta il servizio.

Se il programma avvia un servizio driver, StartService restituisce dopo il completamento dell'inizializzazione del driver del dispositivo.

Per altre informazioni, vedere Avvio di un servizio.