Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save wellington1993/d4ee28a665265b0153f73a5938524484 to your computer and use it in GitHub Desktop.
Save wellington1993/d4ee28a665265b0153f73a5938524484 to your computer and use it in GitHub Desktop.
unit MainService;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.SvcMgr;
type
TMyService = class(TService)
procedure ServiceCreate(Sender: TObject);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceExecute(Sender: TService);
private
{ Private declarations }
FTimer: THandle;
procedure CheckApplication;
public
function GetServiceController: TServiceController; override;
end;
var
MyService: TMyService;
implementation
{$R *.dfm}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
MyService.Controller(CtrlCode);
end;
function TMyService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TMyService.ServiceCreate(Sender: TObject);
begin
// Configurar o intervalo de checagem em milissegundos (aqui, 1 minuto)
FTimer := CreateWaitableTimer(nil, False, nil);
if FTimer = 0 then
RaiseLastOSError;
// Definir o intervalo do timer para 1 minuto (60 segundos)
SetWaitableTimer(FTimer, Int64(60000) * -10000, 60000, nil, nil, False);
end;
procedure TMyService.ServiceStart(Sender: TService; var Started: Boolean);
begin
// Iniciar o serviço
ServiceThread.ProcessRequests(True);
end;
procedure TMyService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
// Parar o serviço
Stopped := True;
end;
procedure TMyService.ServiceExecute(Sender: TService);
var
WaitResult: DWORD;
begin
while not Terminated do
begin
// Aguardar o evento do timer ou do término do serviço
WaitResult := WaitForSingleObject(FTimer, INFINITE);
case WaitResult of
WAIT_OBJECT_0:
begin
// O timer foi acionado, realizar a checagem da aplicação
CheckApplication;
end;
WAIT_FAILED:
begin
// Ocorreu um erro no WaitForSingleObject
ServiceThread.LogError('WaitForSingleObject failed');
Terminate;
end;
WAIT_ABANDONED:
begin
// O objeto de espera foi abandonado
ServiceThread.LogError('WaitForSingleObject abandoned');
Terminate;
end;
end;
// Resetar o timer para a próxima checagem
if not Terminated then
SetWaitableTimer(FTimer, Int64(60000) * -10000, 60000, nil, nil, False);
end;
end;
procedure TMyService.CheckApplication;
var
ProcessHandle: THandle;
ProcessID: DWORD;
begin
// Verificar se a aplicação está em execução pelo nome do processo
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID);
if ProcessHandle <> 0 then
begin
CloseHandle(ProcessHandle);
// A aplicação está em execução, tudo ok
end
else
begin
// A aplicação não está em execução, iniciar a aplicação aqui
WinExec('Caminho\\Para\\Sua\\Aplicacao.exe', SW_SHOW);
end;
end;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment