Created
May 17, 2023 17:52
-
-
Save wellington1993/d4ee28a665265b0153f73a5938524484 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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