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