Criando um serviço no Windows

Top  Previous  Next

Este tutorial foi feito utilizando-se o Delphi 2006. Foi testado e aprovado pelo INMETRO.

Criando um novo serviço para Windows

Menu File / New / Other. Selecione "Service Application"

Será criado um Project1 e Unit1, este último é uma espécie de datamodule, porém é descendente do TService

Timer

Coloque um Timer e coloque a propriedade Interval para 60000 (1 minuto) e salve o projeto.

Propriedades do TService

 

AllowPause, AllowStop

Propriedades que indicam se permite pausar e parar o serviço - deixe True.

 

DisplayName

É a descrição do serviço no Gerenciador de Serviços do Windows. Coloque o que quiser.

 

Interactive

Indica se este serviço vai interagir com o Desktop usando (usando por exemplo ShowMessage). Geralmente é false, mas para este tutorial vamos setar para true.

 

ServiceStartName, Password

Coloque o nome de usuário e senha para o serviço poder startar mesmo antes de logarem no Windows. Geralmente é administrador.

 

ServiceType

Coloque stWin32 para um serviço a nível Windows

 

StartType

Pode ser stAuto, stBoot, stDisabled, stManual, or stSystem (para tipo Win32 apenas Auto, Manual e System são relevantes).

Eventos do TService

 

BeforeInstall, AfterInstall, BeforeUninstall, AfterUninstall

Como proprio nomes dizem, permite você criar ações durante estes eventos

 

OnStart, OnStop, OnPause, OnContinue

Estes eventos são eventos que ocorre quando o usuário pára, inicia e pausa um serviço usando o Gerenciador de Serviços do Windows.

 

OnExecute

Este é o evento que é chamando quando seu serviço é executado. É aqui que vamos escrever nosso código.

OnExecute

procedure TMeuServicoMarket.ServiceExecute(Sender: TService);

begin

  Timer1.Enabled := True;

 

  while not Terminated do

    ServiceThread.ProcessRequests(True); // fica em looping até alguém fechar o serviço

  

  Timer1.Enabled := False;

end;

 

Tudo que ele faz ao iniciar é startar o timer. Agora vamos programar o evento do timer...

OnTimer

procedure TMeuServicoMarket.Timer1Timer(Sender: TObject);

const

  Arquivo = 'c:\logdate.txt';

var

  L: TStrings;

begin

  L := TStringList.Create;    // cria um stringlist

  if FileExists(Arquivo) then // se o arquivo existe, carrega

    L.LoadFromFile(Arquivo);

 

  L.Add(DateTimeToStr(Now));  // adiciona data e hora

  L.SaveToFile(Arquivo);      // salva o arquivo

  L.Free;                     // free willy

 

  ShowMessage(DateTimeToStr(Now));  // mostra uma mensagem (SÓ PARA TESTE!)

end;

 

O conteúdo do timer é auto-explicativo.

Para compilar use CTRL+F9 e agora vamos instalar o serviço...

Instalando serviço

Iniciar / Executar:

Coloque o caminho para seu executável e adicione /INSTALL

 

Se tudo ocorrer bem esta mensagem será exibida:

Para não aparecer esta mensagem adicione /SILENT após o /INSTALL

 

Mesmo feito isso, o serviço não startará automaticamente, esse processo apenas o instalou no Windows.

Iniciar / Executar / Services.msc:

 

Note que o serviço está ali e está no modo automático. Mas não foi iniciado ainda... pressione o botão para startar.

 

A cada minuto o arquivo c:\logdate.txt será atualizado e esta tela deverá aparecer:

Para ver o processo rodando, abra o Gerenciador de tarefas do Windows:

Desinstalar o serviço

Faça o mesmo procedimento, apenas troque /INSTALL para /UNINSTALL

Observação

NÃO USE FORMS para serviços que startam no boot

Final - fonte completo

unit ServicoUnit;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ExtCtrls;

 

type

  TMeuServicoMarket = class(TService)

    Timer1: TTimer;

    procedure ServiceExecute(Sender: TService);

    procedure Timer1Timer(Sender: TObject);

  public

    function GetServiceController: TServiceController; override;

  end;

 

var

  MeuServicoMarket: TMeuServicoMarket;

 

implementation

 

{$R *.DFM}

 

procedure ServiceController(CtrlCode: DWord); stdcall;

begin

  MeuServicoMarket.Controller(CtrlCode);

end;

 

function TMeuServicoMarket.GetServiceController: TServiceController;

begin

  Result := ServiceController;

end;

 

procedure TMeuServicoMarket.ServiceExecute(Sender: TService);

begin

  Timer1.Enabled := True;

  while not Terminated do

    ServiceThread.ProcessRequests(True); 

  Timer1.Enabled := False;

end;

 

procedure TMeuServicoMarket.Timer1Timer(Sender: TObject);

const

  Arquivo = 'c:\logdate.txt';

var

  L: TStrings;

begin

  L := TStringList.Create;    // cria um stringlist

  if FileExists(Arquivo) then // se o arquivo existe, carrega

    L.LoadFromFile(Arquivo);

 

  L.Add(DateTimeToStr(Now));  // adiciona data e hora

  L.SaveToFile(Arquivo);      // salva o arquivo

  L.Free;                     // free willy

 

  ShowMessage(DateTimeToStr(Now));  // mostra uma mensagem (SÓ PARA TESTE!)

end;

 

end.