Delphi - Serviço do Windows executando programa externo

23/11/2017

0

Olá amigos.
Eu desenvolvi um serviço do windows para executar uma tarefa, está funcionando corretamente, porem eu tenha uma aplicação que faz o auto-update desse serviço, no entanto eu gostaria que o serviço chamasse essa aplicação.
Experimentei WinExec, ShellExec e CreateProcess, em ambos o executavel aparece no gerenciador de processo, mas não mostra a tela, e eu fiz um teste nem a procedure Create roda, já habilitei a opção para o serviço interagir com a area de trabalho.
Alguém poderia me ajudar?
Segue o procedimento que estou sando no serviço para tentar executar a aplicação.
Eu coloquei um timer que após 5 segundos do serviço ter iniciado ele executa esse procedimento

procedure TService1.timer1Timer(Sender: TObject);
var
SUInfo : TStartUpInfo;
ProcInfo: TProcessInformation;
CmdLine : String;
begin
Timer1.Enabled := False;

CmdLine := '"' + ExtractFilePath(Application.ExeName) + '"';
FillChar(SUInfo, SizeOf(SUInfo), #0);

with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOW;
end;

CreateProcess(nil, PChar(CmdLine), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(FileName)), SUInfo, ProcInfo);

end;

Desde já fico muito grato a quem puder dar alguma luz.
Bruno Oliveira

Bruno Oliveira

Responder

Posts

15/12/2017

Jair Viana

Amigo. Tenho o mesmo problema, tem um artigo da Devmedia sobre serviço no Delphi. Fiz um questionamento deste problema para o autor e depois de muitas respostas e tentativas acabei desistindo. Resolvi automatizar o serviço de update sem interação do usuário.<br />
Creio que isso se deve a segurança do Windows, pois até o XP funcionava beleza.<br />
<br />
Continuo pesquisando, se achar uma solução compartilho.<br />
Responder

13/02/2020

Antonio Silva

Olá amigos.
Eu desenvolvi um serviço do windows para executar uma tarefa, está funcionando corretamente, porem eu tenha uma aplicação que faz o auto-update desse serviço, no entanto eu gostaria que o serviço chamasse essa aplicação.
Experimentei WinExec, ShellExec e CreateProcess, em ambos o executavel aparece no gerenciador de processo, mas não mostra a tela, e eu fiz um teste nem a procedure Create roda, já habilitei a opção para o serviço interagir com a area de trabalho.
Alguém poderia me ajudar?
Segue o procedimento que estou sando no serviço para tentar executar a aplicação.
Eu coloquei um timer que após 5 segundos do serviço ter iniciado ele executa esse procedimento

procedure TService1.timer1Timer(Sender: TObject);
var
SUInfo : TStartUpInfo;
ProcInfo: TProcessInformation;
CmdLine : String;
begin
Timer1.Enabled := False;

CmdLine := '"' + ExtractFilePath(Application.ExeName) + '"';
FillChar(SUInfo, SizeOf(SUInfo), #0);

with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOW;
end;

CreateProcess(nil, PChar(CmdLine), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(FileName)), SUInfo, ProcInfo);

end;

Desde já fico muito grato a quem puder dar alguma luz.



Olá galera sei que o post é antigo, mas vaí aí uma dica para quem precisar...

procedure TDMGuardian.AtivarProcesso(Processo: string);
var
hToken: THandle;
StartupInfo: Windows.TStartupInfo;
ProcessInfo: Windows.TProcessInformation;
res: boolean;
Arquivo: string;
begin
Arquivo := ExtractFilePath(Application.ExeName) + Processo;

if not ProcessExists(Processo) then
begin
GeraLogService('O ' + Processo + ' não está sendo executado.O serviço do ACBrGuardian vai ativa-lo');

try
Windows.GetStartupInfo(StartupInfo);
if WTSQueryUserToken(WtsGetActiveConsoleSessionID, hToken) then
begin
res := Windows.CreateProcessAsUser(hToken, pchar(Arquivo), nil, nil, nil, False, CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInfo);
// if res then
// WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(hToken);
end;

except on E: Exception do
GeraLogService('Erro ao tentar abrir ' + Arquivo + ' : ' + E.Message);
end;
GeraLogService('Guardian ativou o ' + Processo);
end;
end;


Utilizo aqui de boas.
No parametro (processo) passo o nome do executável que quero executar:

Exemplo:

AtivarProcesso('MeuProg.exe');

Abs
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar