Inicialização de serviço
Para iniciar um serviço de serviço ou driver, o programa de controle de serviço usa a função StartService . A função StartService falhará se o banco de dados estiver bloqueado. Se isso ocorrer, o programa de controle de serviço deverá aguardar alguns segundos e chamar StartService novamente. Ele pode marcar o status de bloqueio atual do banco de dados chamando a função QueryServiceLockStatus.
Se o programa de controle de serviço estiver iniciando um serviço, ele poderá usar a função StartService para especificar uma matriz de argumentos a serem passados para a função ServiceMain do serviço. A função StartService retorna depois que um novo thread é criado para executar a função ServiceMain . O programa de controle de serviço pode recuperar o status do serviço recém-iniciado em uma estrutura SERVICE_STATUS chamando a função QueryServiceStatus. Durante a inicialização, o membro dwCurrentState deve ser SERVICE_START_PENDING. O membro dwWaitHint é um intervalo de tempo, em milissegundos, que indica quanto tempo o programa de controle de serviço deve aguardar antes de chamar QueryServiceStatus novamente. Quando a inicialização for concluída, o serviço alterará dwCurrentState para SERVICE_RUNNING.
O gerenciador de controle de serviço não dá suporte à passagem de variáveis de ambiente personalizadas para um serviço na inicialização. Além disso, o gerenciador de controle de serviço não detecta e transmite alterações para variáveis de ambiente à medida que o serviço está em execução. Em vez de tornar um serviço dependente de uma variável de ambiente, use valores do Registro ou argumentos ServiceMain .
Veja a seguir uma visão geral simplificada do que acontece quando um serviço típico é iniciado pelo gerenciador de controle de serviço:
- O SCM lê o caminho do serviço do registro e se prepara para iniciar o serviço. Isso inclui a aquisição do bloqueio de serviço. Qualquer tentativa de iniciar outro serviço enquanto o bloqueio de serviço é mantido será bloqueada até que o bloqueio de serviço seja liberado.
- O SCM inicia o processo e aguarda até que o processo filho seja encerrado (indicando uma falha) ou relata o SERVICE_RUNNING status.
- O aplicativo executa sua inicialização muito simples e chama a função StartServiceCtrlDispatcher .
- StartServiceCtrlDispatcher conecta-se ao gerenciador de controle de serviço e inicia um segundo thread que chama a função ServiceMain para o serviço. O ServiceMain deve relatar SERVICE_RUNNING o mais rápido possível.
- Quando o gerenciador de controle de serviço é notificado de que o serviço está em execução, ele libera o bloqueio de serviço.
Se o serviço não atualizar seu status dentro de 80 segundos, além da última dica de espera, o gerenciador de controle de serviço determinará que o serviço parou de responder. O gerenciador de controle de serviço registrará um evento e interromperá o serviço.
Se o programa estiver iniciando um serviço de driver, StartService retornará depois que o driver do dispositivo concluir sua inicialização.
Para obter mais informações, consulte Iniciando um serviço.