Condividi tramite


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] fino a lpServiceArgVectors[dwNumServicesArgs-1]).

Se l'utente avvia un servizio manuale usando lo snap-in Servizi dal Pannello di controllo, le stringhe per l'lpServiceArgVectors parametro provengono dalla finestra di dialogo delle proprietà per il 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 in 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 di controllo del servizio riceve una richiesta di avvio di un servizio, avvia il processo del 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 di controllo del servizio invia quindi una richiesta di avvio al dispatcher del controllo del servizio per questo processo del servizio. Il dispatcher del controllo del servizio crea un nuovo thread per eseguire la funzione ServiceMain del servizio in fase di avvio.

La funzione ServiceMain deve chiamare immediatamente la funzione RegisterServiceCtrlHandlerEx di per specificare una funzione HandlerEx per gestire le richieste di controllo. A questo punto, deve chiamare la funzione SetServiceStatus per inviare informazioni sullo stato al gestore del 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 non segnala lo stato di SERVICE_RUNNING. È consigliabile che il servizio segnala questo stato il più rapidamente possibile, poiché 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.

Gestione controllo servizi blocca il database di controllo del servizio durante l'inizializzazione, pertanto se un servizio tenta di chiamare StartService durante l'inizializzazione, la chiamata verrà bloccata. Quando il servizio segnala a Gestione controllo servizi 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 lo stato di SERVICE_RUNNING.

La funzione ServiceMain deve creare un evento globale, chiamare la funzione RegisterWaitForSingleObject su questo evento e uscire. Questo terminerà il thread che esegue la funzione ServiceMain, ma non terminerà 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 del 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 è consigliabile eseguire codice di servizio aggiuntivo perché è possibile introdurre una race condition se il servizio riceve un controllo di avvio e serviceMain viene chiamato di nuovo. Si noti che questo problema è più probabile che si verifichi quando più servizi condividono un processo.

Esempi

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 del preprocessore UNICODE. La combinazione dell'utilizzo dell'alias indipendente dalla codifica con il codice non indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere convenzioni di per i prototipi di funzioni.

Fabbisogno

Requisito Valore
client minimo supportato Windows XP [solo app desktop]
server minimo supportato Windows Server 2003 [solo app desktop]
piattaforma di destinazione Finestre
intestazione winsvc.h (include Windows.h)

Vedere anche

HandlerEx

RegisterServiceCtrlHandlerEx

RegisterWaitForSingleObject

SERVICE_TABLE_ENTRY

Funzioni del servizio

funzione ServiceMain del servizio

SetServiceStatus

StartServiceCtrlDispatcher