Criando um Windows Service

Nesse artigo irei mostrar a vocês como criar, manipular eventos, instalar e desinstalar um serviço usando o Delphi 2005.

Por que eu devo ler este artigo? Diferente das aplicações win32 e .net você pode criar uma aplicação que irá ser executada em background como um serviço do Windows. Nessa artigo irei mostrar a vocês como é simples criar esse tipo de aplicativo que poderá ser utilizado para verificar o número de usuários que estão on-line no seu sistema Win32 feito em Delphi, também poderá ser utilizado para criação de uma rotina de backup que será executada a cada 3 horas, como uma rotina que deverá ficar checando a cotação do Dolare atualizando os dados do seu sistema, em fim, existem várias utilidades para se criar esse tipo de sistema.

Para começar abra o delphi e clique em File | New | Project | Marque a opção Delphi Project | Clique em Service Application conforme mostra a figura abaixo:

Salve tudo. Mude o nome da Unit para Principal e o nome do Projeto para MySerivce. Sua aplicação deverá ficar de acordo com a figura abaixo

Entendendo as propriedades e eventos

Após criar o seu serviço as propriedades AllowPausee AllowStop estarão marcadas como True. Issoacontece quando você deseja permitir quea sua aplicação possa ser Pausada ouInterrompida (Parada)por um usuário que tem acesso ao Gerenciador de Serviços do Windows em Painel de Controle | Ferramentas | Serviços.

Você também tem uma propriedade chamada Dependencies que é uma coleção de outros serviços. Isso acontece porque você pode precisar criar um serviço que dependa da execução de outro que deverá estar rodando. POr exemplo: Eu posso criar um serviço que para ter êxito durante a sua execução eu precise garantir que o serviço de chamadas remotas esteja em execução. Veja como eu faço isso na figura abaixo

A propriedade DisplayName contém o nome do serviço como aparecerá no Gerenciar de Serviços após sua execução. Se você precisa que o seu serviço seja executado com credencias de um usuário que tem privlégios especiais você deverá informar o contéudo das propriedades ServiceStartName (nome do usuário) e Password (sua senha).

Quanto a especificação dos Eventos já são bem descritivos. O próprio nome descreve a sua funcionalidade. Para entendermos como eles funcionam vamos criar uma procedure em nosso serviço que irá preencher um log sempre que um dos eventos for disparado.

Codificando

Mude o nome das propriedades DisplayNamee Name para MyService e srvPrincipal respectivamente. Agora escreva o código abaixo:

Agora que criamos a nossa rotina para gerar o log vamos utilizá-la em cada evento da nossa aplicação. Aqui vai a dica de ouro meus amigos. Quando o evento OnExecute termina a sua execução a Theread que gerencia o serviço termina. Então você precisa implementar um artifício para ficar chamando o método ProcessRequest até que sua aplicação seja definitavemte interrompida pelo usuário. Se você não implementar o código abaixo no Evento OnExecute do seu serviço ele não terá qualquer funcionalidade.

while not self.Terminated do ServiceThread.ProcessRequests(true); procedure ServiceController(CtrlCode: DWord); stdcall; begin srvPrincipal.Controller(CtrlCode); end; function TsrvPrincipal.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TsrvPrincipal.ServiceAfterInstall(Sender: TService); begin doSaveLog('ServiceAfterInstall'); end; procedure TsrvPrincipal.ServiceAfterUninstall(Sender: TService); begin doSaveLog('ServiceAfterUninstall'); end; procedure TsrvPrincipal.ServiceBeforeInstall(Sender: TService); begin doSaveLog('ServiceBeforeInstall'); end; procedure TsrvPrincipal.ServiceBeforeUninstall(Sender: TService); begin doSaveLog('ServiceBeforeUninstall'); end; procedure TsrvPrincipal.ServiceContinue(Sender: TService; var Continued: Boolean); begin doSaveLog('ServiceContinue'); end; procedure TsrvPrincipal.ServiceCreate(Sender: TObject); begin doSaveLog('ServiceCreate'); end; procedure TsrvPrincipal.ServiceDestroy(Sender: TObject); begin doSaveLog('ServiceDestroy'); end; procedure TsrvPrincipal.ServiceExecute(Sender: TService); begin doSaveLog('ServiceExecute'); while not self.Terminated do ServiceThread.ProcessRequests(true); end; procedure TsrvPrincipal.ServicePause(Sender: TService; var Paused: Boolean); begin doSaveLog('ServicePause'); end; procedure TsrvPrincipal.ServiceShutdown(Sender: TService); begin doSaveLog('ServiceShutdown'); end; procedure TsrvPrincipal.ServiceStart(Sender: TService; var Started: Boolean); begin doSaveLog('ServiceStart'); end; procedure TsrvPrincipal.ServiceStop(Sender: TService; var Stopped: Boolean); begin doSaveLog('ServiceStop'); end;

Instalando o Serviço

Diferente de nossas aplicações Win32 que só é necessário Instalar o BDE, copiar EXE, ou dlls do DBExpress. Quando falamos de serviço temos que instalá-lo por meio de linhas de comando. Façamos assim: Compile o seu serviço e copie o executável para dentro da pasta c:\windows | abra o prompt de comando e digite a linha abaixo:

Para desinstalar o serviço basta executar a linha de comando: MyService /uninstall

Executando o Serviço e tetando o Log

Agora que criamos e instalamos vamos verificar se ele está funcionando corretamente. Em painel de contorle | ferramentas | serviços | você deverá encontrar um serviço na relação do gerenciador.

Agora você pode executar, parar, pausar e reinicar e verificar as informações no log que foi gerado dentro do caminho c:\log.log.

Veja como ficou o meu log depois de executar os comandos:

log.log 10:03:40:ServiceCreate 10:03:40:ServiceStart 10:03:40:ServiceExecute 10:03:43:ServicePause 10:03:46:ServiceStop 10:03:46:ServiceDestroy 10:03:49:ServiceCreate 10:03:49:ServiceStart 10:03:49:ServiceExecute 10:03:51:ServiceStop 10:03:51:ServiceDestroy 10:03:52:ServiceCreate 10:03:52:ServiceStart 10:03:52:ServiceExecute

No próximo artigo vamos criar um serviço com uma janela de parametrização para pedir o usuário, senha e o site que contém a cotação do Dolar e o caminho da nossa base de dados. Então a cada 5,10,15,20 ou sei quantos minutos ele irá atualizar a nossa base de dados caso a cotação tenha sofrido algma alteração.

Criei umnovo artigo mostrando como trabalhar com Form sem uma Aplicação Windows Service

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados