LPSERVICE_MAIN_FUNCTIONA funzione di callback (winsvc.h)

Punto di ingresso per un servizio.

Il tipo LPSERVICE_MAIN_FUNCTION definisce un puntatore a questa funzione di callback. ServiceMain è un segnaposto per un nome di funzione definito dall'applicazione.

Sintassi

LPSERVICE_MAIN_FUNCTIONA LpserviceMainFunctiona;

void LpserviceMainFunctiona(
  [in] DWORD dwNumServicesArgs,
  [in] LPSTR *lpServiceArgVectors
)
{...}

Parametri

[in] dwNumServicesArgs

Numero di argomenti nella matrice lpServiceArgVectors .

[in] lpServiceArgVectors

Stringhe di argomenti con terminazione null passate al servizio dalla chiamata alla funzione StartService che ha avviato il servizio. 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[dwNumServicesArgsArgs-1]).

Se l'utente avvia un servizio manuale usando lo snap-in Servizi dalla Pannello di controllo, le stringhe per il parametro lpServiceArgVectors provengono dalla finestra di dialogo proprietà del servizio (dallo snap-in Servizi, fare clic con il pulsante destro del mouse sulla voce del servizio, fare clic su Proprietà e immettere i parametri nei parametri Start).

Valore restituito

nessuno

Osservazioni

Un programma di servizio può avviare uno o più servizi. Un processo di servizio ha una struttura SERVICE_TABLE_ENTRY per ogni servizio che può avviare. La struttura specifica il nome del servizio e un puntatore alla funzione ServiceMain per tale servizio.

Quando il gestore del controllo del servizio riceve una richiesta di avvio di un servizio, avvia il processo di servizio (se non è già in esecuzione). Il thread principale del processo del servizio chiama la funzione StartServiceCtrlDispatcher con un puntatore a una matrice di strutture SERVICE_TABLE_ENTRY . Il gestore del controllo del servizio invia quindi una richiesta iniziale al dispatcher del controllo del servizio per questo processo di servizio. Il dispatcher del controllo del servizio crea un nuovo thread per eseguire la funzione ServiceMain del servizio avviato.

La funzione ServiceMain deve chiamare immediatamente la funzione RegisterServiceCtrlHandlerEx per specificare una funzione HandlerEx per gestire le richieste di controllo. Successivamente, deve chiamare la funzione SetServiceStatus per inviare informazioni sullo stato alla gestione controllo del servizio. Dopo queste chiamate, la funzione deve completare l'inizializzazione del servizio. Non tentare di avviare un altro servizio nella funzione ServiceMain .

Service Control Manager (SCM) attende fino a quando il servizio segnala uno stato di SERVICE_RUNNING. È consigliabile che il servizio segnala questo stato il più rapidamente possibile, mentre altri componenti del sistema che richiedono l'interazione con SCM verranno bloccati durante questo periodo. Alcune funzioni possono richiedere l'interazione con SCM direttamente o indirettamente.

SCM blocca il database di controllo del servizio durante l'inizializzazione, quindi se un servizio tenta di chiamare StartService durante l'inizializzazione, la chiamata verrà bloccata. Quando il servizio segnala a SCM che è stato avviato correttamente, può chiamare StartService. Se il servizio richiede l'esecuzione di un altro servizio, il servizio deve impostare le dipendenze necessarie.

Inoltre, non è consigliabile chiamare funzioni di sistema durante l'inizializzazione del servizio. Il codice del servizio deve chiamare le funzioni di sistema solo dopo che segnala uno stato di SERVICE_RUNNING.

La funzione ServiceMain deve creare un evento globale, chiamare la funzione RegisterWaitForSingleObject in questo evento e uscire. Verrà terminato il thread che esegue la funzione ServiceMain , ma non termina il servizio. Quando il servizio viene arrestato, il gestore del controllo del servizio deve chiamare SetServiceStatus con SERVICE_STOP_PENDING e segnalare questo evento. Un thread dal pool di thread eseguirà la funzione di callback di attesa; questa funzione deve eseguire attività di pulizia, inclusa la chiusura dell'evento globale e chiamare SetServiceStatus con SERVICE_STOPPED. Dopo che il servizio è stato arrestato, non è necessario eseguire alcun codice di servizio aggiuntivo perché è possibile introdurre una condizione di gara se il servizio riceve un controllo start e ServiceMain viene chiamato di nuovo. Si noti che questo problema è più probabile che si verifichi quando più servizi condividono un processo.

Esempio

Per un esempio, vedere Scrittura di una funzione ServiceMain.

Nota

L'intestazione winsvc.h definisce LPSERVICE_MAIN_FUNCTION come alias che seleziona automaticamente la versione ANSI o Unicode di questa funzione in base alla definizione della costante 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

   
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)

Vedi anche

HandlerEx

RegisterServiceCtrlHandlerEx

Registerwaitforsingleobject

SERVICE_TABLE_ENTRY

Funzioni del servizio

Funzione ServiceMain

SetServiceStatus

StartServiceCtrlDispatcher