09/06/2010



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. Salve tudo. Mude o nome da Unit para Principal e o nome do Projeto para MySerivce.



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.




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.

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

Fonte ]

0 comentários:

Postar um comentário