Nesse artigo irei mostrar a vocês como criar, manipular eventos, instalar e desinstalar um serviço usando o Delphi 2005.
Artigos Delphi Criando um Windows Service
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.
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);
srvPrincipal.Controller(CtrlCode);
end;   function TsrvPrincipal.GetServiceController: TServiceController;
end;   procedure TsrvPrincipal.ServiceAfterInstall(Sender: TService);
doSaveLog('ServiceAfterInstall');
end;   procedure TsrvPrincipal.ServiceAfterUninstall(Sender: TService);
doSaveLog('ServiceAfterUninstall');
end;   procedure TsrvPrincipal.ServiceBeforeInstall(Sender: TService);
doSaveLog('ServiceBeforeInstall');
end;   procedure TsrvPrincipal.ServiceBeforeUninstall(Sender: TService);
doSaveLog('ServiceBeforeUninstall');
end;   procedure TsrvPrincipal.ServiceContinue(Sender: TService;
doSaveLog('ServiceContinue');
end;   procedure TsrvPrincipal.ServiceCreate(Sender: TObject);
doSaveLog('ServiceCreate');
end;   procedure TsrvPrincipal.ServiceDestroy(Sender: TObject);
doSaveLog('ServiceDestroy');
end;   procedure TsrvPrincipal.ServiceExecute(Sender: TService);
doSaveLog('ServiceExecute');   while not self.Terminated do
end;   procedure TsrvPrincipal.ServicePause(Sender: TService; var Paused: Boolean);
doSaveLog('ServicePause');
end;   procedure TsrvPrincipal.ServiceShutdown(Sender: TService);
doSaveLog('ServiceShutdown');
end;   procedure TsrvPrincipal.ServiceStart(Sender: TService; var Started: Boolean);
doSaveLog('ServiceStart');
end;   procedure TsrvPrincipal.ServiceStop(Sender: TService; var Stopped: Boolean);
doSaveLog('ServiceStop');
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:
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.