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:

imagem

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

imagem

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

imagem

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:

imagem

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:

imagem

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.

imagem

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