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 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
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. |