Condividi tramite


Avvio del servizio

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

Se il programma di controllo del servizio avvia un servizio, può usare la funzioneStartServiceper 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 di SERVICE_STATUS chiamando la funzioneQueryServiceStatus. Durante l'inizializzazione, il membro dwCurrentState deve essere SERVICE_START_PENDING. Il membro dwWaitHint è un intervallo di tempo, espresso in millisecondi, che indica per quanto tempo il programma di controllo del servizio deve attendere prima di chiamare di nuovo QueryServiceStatus. Al termine dell'inizializzazione, il servizio cambia dwCurrentState in SERVICE_RUNNING.

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

Di seguito è riportata una panoramica semplificata di ciò che accade quando un servizio tipico viene avviato dal gestore di 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 l'uscita del processo figlio (che indica un errore) o segnala lo stato di SERVICE_RUNNING.
  • L'applicazione esegue l'inizializzazione molto semplice e chiama la funzioneStartServiceCtrlDispatcher.
  • StartServiceCtrlDispatcher si connette al gestore di controllo del servizio e avvia un secondo thread che chiama la funzioneServiceMain per il servizio. ServiceMain deve segnalare SERVICE_RUNNING il prima possibile.
  • Quando il gestore di controllo del servizio riceve una notifica che indica 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, gestione controllo del servizio determina che il servizio ha smesso di rispondere. Gestione controllo del servizio registra un evento e arresta il servizio.

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

Per altre informazioni, vedere Avvio di un servizio.