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 utilizzando lo snap-in Servizi dal Pannello di controllo, le stringhe per il parametro lpServiceArgVectors 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, scegliere 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ò essere avviato. 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 per specificare una funzione HandlerEx per gestire le richieste di controllo. Successivamente, deve chiamare la funzione SetServiceStatus per inviare informazioni sullo stato al gestore di 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 finché il servizio non segnala lo stato di SERVICE_RUNNING. È consigliabile che il servizio restituisca 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 Gestione configurazione sito direttamente o indirettamente.

SCM 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 configurazione sito 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 alcuna funzione 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 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 l'arresto del servizio, 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.

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

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)

Vedi anche

HandlerEx

RegisterServiceCtrlHandlerEx

Registerwaitforsingleobject

SERVICE_TABLE_ENTRY

Funzioni del servizio

ServiceMain, funzione

SetServiceStatus

StartServiceCtrlDispatcher