Ponto de Entrada de Serviço
Os serviços geralmente são escritos como aplicativos de console. O ponto de entrada de um aplicativo de console é sua função main. A função main recebe argumentos do valor ImagePath da chave do Registro para o serviço. Para obter mais informações, consulte a seção Comentários da função CreateService .
Quando o SCM inicia um programa de serviço, ele aguarda que ele chame a função StartServiceCtrlDispatcher . Use as diretrizes a seguir.
- Um serviço do tipo SERVICE_WIN32_OWN_PROCESS deve chamar StartServiceCtrlDispatcher imediatamente, de seu thread main. Você pode executar qualquer inicialização após o início do serviço, conforme descrito na Função Service ServiceMain.
- Se o tipo de serviço for SERVICE_WIN32_SHARE_PROCESS e houver inicialização comum para todos os serviços no programa, você poderá executar a inicialização no thread main antes de chamar StartServiceCtrlDispatcher, desde que leve menos de 30 segundos. Caso contrário, você deve criar outro thread para fazer a inicialização comum, enquanto o thread main chama StartServiceCtrlDispatcher. Você ainda deve executar qualquer inicialização específica do serviço após o início do serviço.
A função StartServiceCtrlDispatcher usa uma estrutura SERVICE_TABLE_ENTRY para cada serviço contido no processo. Cada estrutura especifica o nome do serviço e o ponto de entrada para o serviço. Para obter um exemplo, consulte Escrevendo a função de main de um programa de serviço.
Se StartServiceCtrlDispatcher for bem-sucedido, o thread de chamada não retornará até que todos os serviços em execução no processo tenham entrado no estado SERVICE_STOPPED. O SCM envia solicitações de controle para esse thread por meio de um pipe nomeado. O thread atua como um dispatcher de controle, executando as seguintes tarefas:
- Crie um novo thread para chamar o ponto de entrada apropriado quando um novo serviço for iniciado.
- Chame a função de manipulador apropriada para lidar com solicitações de controle de serviço.
Tópicos relacionados