Criando um Windows Service

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (23)  (0)

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

O que é e para que serve?
 
     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 Dolar e atualizando os dados do seu sistema, em fim, existem várias utilidades para se criar esse tipo de sistema.
 
Como 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 AllowPause e AllowStop estarão marcadas como True. Isso acontece quando você deseja permitir que a sua aplicação possa ser Pausada ou Interrompida (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 DisplayName e 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 um novo artigo mostrando como trabalhar com Forms em uma Aplicação Windows Service 
 
Abraço!
 
 
 
 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?