Reiniciar aplicativo Externo automatico

Delphi

06/10/2012

Ola pessoal bom dia a todos!

To precizando de mais uma ajudinha aqui, preciso de um codigo para quando meu aplicativo executar um outro externo oculto ou não oculto, ae se este aplicativo externo for fechado por alguem ou até mesmo fechar sozinho, atomaticamente meu aplicativo renicie ele
Cgm2k7 2013

Cgm2k7 2013

Curtidas 0

Respostas

Rafael Encinas

Rafael Encinas

06/10/2012

Bem.

O que tu podes fazer é o seguinte: Se o aplicativo estiver no mesmo computador, você pode colocar um Timer, que de tempos em tempos verifica nos Processos do Windows se o aplicativo está executando.

O nome do processo é igual ao nome do executável;


A mesma coisa que fazemos quando queremos que o aplicativo execute somente uma vez, porém adaptando-se algumas coisas;

Grato
GOSTEI 0
Cgm2k7 2013

Cgm2k7 2013

06/10/2012

Bem.

O que tu podes fazer é o seguinte: Se o aplicativo estiver no mesmo computador, você pode colocar um Timer, que de tempos em tempos verifica nos Processos do Windows se o aplicativo está executando.

O nome do processo é igual ao nome do executável;


A mesma coisa que fazemos quando queremos que o aplicativo execute somente uma vez, porém adaptando-se algumas coisas;

Grato


Ae amigo! voce poderia coloca um exemplo ?!
sou novo em delphi não to conseguindo adapitar este codigo:
procedure TForm1.VerificarExecucao;
var
  MutexHandle: THandle;
  hwind: HWND;

begin
  MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');
  if MutexHandle <> 0 then
  begin
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageBox(0, 'Este programa já está em execução!', '', mb_IconHand);
      CloseHandle(MutexHandle);
      hwind := 0;
      repeat
        hwind := Windows.FindWindowEx(0, hwind, 'TApplication', 'appexterno');
      until (hwind <> Application.Handle);
      if (hwind <> 0) then
      begin
        Windows.ShowWindow(hwind, SW_SHOWNORMAL);
        Windows.SetForegroundWindow(hwind);
      end;
      Halt;
end;
end;
end;
GOSTEI 0
Cgm2k7 2013

Cgm2k7 2013

06/10/2012

bom dia a todos!
consegui resolver parte da minha duvida...
achei um fonte q verifica se um aplicativo .exe esta em execução entam como o amigo ai em cima disse coloquei um ttime
q ferifica de 30 em 30 segundos se o aplicativo esta em execução se não estiver ele executa novante mas se tiver ele não fanada.
O fonte para verificar se um aplicativo esta em execução no gerenciador de tarefas é:

procedure TAutoStart_frm.CreateWin9xProcessList(List: TstringList);
var
  hSnapShot: THandle;
  ProcInfo: TProcessEntry32;
begin
  if List = nil then Exit;
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot <> THandle(-1)) then
  begin
    ProcInfo.dwSize := SizeOf(ProcInfo);
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
      List.Add(ProcInfo.szExeFile);
      while (Process32Next(hSnapShot, ProcInfo)) do
        List.Add(ProcInfo.szExeFile);
    end;
    CloseHandle(hSnapShot);
  end;

end;

procedure TAutoStart_frm.GetProcessList(var List: TstringList);
var
  ovi: TOSVersionInfo;
begin
  if List = nil then Exit;
  ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(ovi);
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List);
    VER_PLATFORM_WIN32_NT: CreateWin9xProcessList(List);
  end
end;

function TAutoStart_frm.EXE_Running(FileName: string; bFullpath: Boolean): Boolean;
var
  i: Integer;
  MyProcList: TstringList;
begin
  MyProcList := TStringList.Create;
  try
    GetProcessList(MyProcList);
    Result := False;
    if MyProcList = nil then Exit;
    for i := 0 to MyProcList.Count - 1 do
    begin
      if not bFullpath then
      begin
        if CompareText(ExtractFileName(MyProcList.Strings[i]), FileName) = 0 then
          Result := True
      end
      else if CompareText(MyProcList.strings[i], FileName) = 0 then Result := True;
      if Result then Break;
    end;
  finally
    MyProcList.Free;
  end;
{exemplo de com usar}
procedure TAutoStart_frm.sBitBtn3Click(Sender: TObject);
begin
      if apache.Checked then
  if EXE_Running('apache.exe', False) then
      else
     ShellExecute(handle, 'open', 'Apache.bat', pchar(''),'Apache_Server', SW_SHOWNORMAL);
end;


Só falta o possal ae me ajudar com o outro topico q criei aqui
https://www.devmedia.com.br/forum/executar-aplicativo-em-delphi-oculto/425314

a minha duvida de como executar um aplicativo externo oculta me encinaram de tantas maneiras q fiquei até em duvida de qual usar em meu projeto mas já a duvida de como mostrar um aplicativo q já esta oculto ninguem consegui me ajudar.
Sera de alguem aqui poderia me ajudar?!

vou repetira a duvida :
tenho um form1 com dois botões
botão1 : executa um aplicativo externo em oculto
botão2 : mostra este aplicativo q esta oculto sem reiniciar ele.

não sei se me exprecei bem mas ta ae minha duvida ainda não resolvida...

agradeço a todos pela a teção
pesso desculpa pelos erro de portugues, era poque nas aula de português eu pulava o muro da escola para ir namorar "KKKK"...
GOSTEI 0
Thiago Schnell

Thiago Schnell

06/10/2012

vc vai precisar ultilizar uma thread pra isso, depois use createprocess e por fim aguarde exitcode para executar novamente.

se vc tem familiaridade com comobj vc pode usar vbscript fazer o mesmo processo porém menos trabalhoso.
GOSTEI 0
Cgm2k7 2013

Cgm2k7 2013

06/10/2012

vc vai precisar ultilizar uma thread pra isso, depois use createprocess e por fim aguarde exitcode para executar novamente.

se vc tem familiaridade com comobj vc pode usar vbscript fazer o mesmo processo porém menos trabalhoso.


Sou aprediz ainda não sei nada se vc postar ae um pequeno exemplo me ajudaria muito
vlw...
GOSTEI 0
Thiago Schnell

Thiago Schnell

06/10/2012

coloque o código abaixo dentro de um component TTIMER já que vc é iniciante nao vou abordar thread.



function RunAndWait(Filename:String): BOOL;
var
  ProcessInfo: TProcessInformation;
  StartupInfo: TStartupInfo;
  ExitCode: DWORD;
begin
 try
  Result:= False;
   Assert(FileExists(FileName));
   GetStartupInfo(StartupInfo);
   UniqueString(FileName);
    if CreateProcess(nil, pChar(filename), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo) then
      try
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
        Assert(Win32Check(GetExitCodeProcess(ProcessInfo.hProcess, ExitCode ) ));
        if ExitCode = NO_ERROR then
        Result:= True
      finally
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread );
      end;
  except
 end;
end;

//declaracao do ponto inicio
label inicio;
begin
  //desliga o timer para nao ter que repetir o codigo continuamente
  TTimer(Sender).Enabled:=false;
  //marcamos aqui um ponto chamado de inicio
INICIO:
  showmessage('o programa sera executado');
  //coloque aqui o caminho do programa que vc quer chamar
if RunAndWait('C:\windows\system32\calc.exe') then
//volta ao ponto que marcamos como inicio
  goto inicio
 else showmessage('algum erro aconteceu')
end;

GOSTEI 0
Cgm2k7 2013

Cgm2k7 2013

06/10/2012

coloque o código abaixo dentro de um component TTIMER já que vc é iniciante nao vou abordar thread.



function RunAndWait(Filename:String): BOOL;
var
  ProcessInfo: TProcessInformation;
  StartupInfo: TStartupInfo;
  ExitCode: DWORD;
begin
 try
  Result:= False;
   Assert(FileExists(FileName));
   GetStartupInfo(StartupInfo);
   UniqueString(FileName);
    if CreateProcess(nil, pChar(filename), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo) then
      try
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
        Assert(Win32Check(GetExitCodeProcess(ProcessInfo.hProcess, ExitCode ) ));
        if ExitCode = NO_ERROR then
        Result:= True
      finally
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread );
      end;
  except
 end;
end;

//declaracao do ponto inicio
label inicio;
begin
  //desliga o timer para nao ter que repetir o codigo continuamente
  TTimer(Sender).Enabled:=false;
  //marcamos aqui um ponto chamado de inicio
INICIO:
  showmessage('o programa sera executado');
  //coloque aqui o caminho do programa que vc quer chamar
if RunAndWait('C:\windows\system32\calc.exe') then
//volta ao ponto que marcamos como inicio
  goto inicio
 else showmessage('algum erro aconteceu')
end;



valeu mano
este vai servi pra meu projeto vlw mesmo ajudou muito grato...

Ma tenhum duvida se vc poder me ajudar?!
sempre q ele executa o aplicativo externo não poço mecher no meu form, tipo em qunado o aplicativo esta em execução não poço mechar em da no programa
GOSTEI 0
Thiago Schnell

Thiago Schnell

06/10/2012

hm...

coloque um button e dê 2x clique encima dele

troque o código por esse abaixo:

function ThreadProc(Param: Pointer): DWORD; stdcall;
begin
// coloque o codigo que vc uso dentro da timer aqui...
  form1.Timer1Timer(form1.Timer1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Handle,
  Id: DWORD;
begin
 Handle:= CreateThread(nil, 0, @ThreadProc, Self, 0, ID);
end;
GOSTEI 0
Alisson Santos

Alisson Santos

06/10/2012

Conseguiu sanar sua duvida amigo??
GOSTEI 0
Mysql_2013

Mysql_2013

06/10/2012

hm...

coloque um button e dê 2x clique encima dele

troque o código por esse abaixo:

function ThreadProc(Param: Pointer): DWORD; stdcall;
begin
// coloque o codigo que vc uso dentro da timer aqui...
  form1.Timer1Timer(form1.Timer1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Handle,
  Id: DWORD;
begin
 Handle:= CreateThread(nil, 0, @ThreadProc, Self, 0, ID);
end;


Valeu mano muito obrigado mesmo deu serto aqui para o q eu queria vlw...
depois vou colocar o fote do programinha aqui pra galera iniciante q tiver a mesmas duvidas
Este programa q estou fazendo e pra executar um serve de wow q são 4 aplicativos "WorldServer.exe, AuthServer.exe, MySql_server.bat e Apache2.2_server.bat" com ajuda do amigo ae consegui fazer com que se algun deste alicativos for fechado ou der erro e se fechar automaticamente o programinha q criei executa eles novamente.

Só faltou a duvida de como mostrar aplicativo oculto.
mas tudo bem desisti vou finalizar sem este mesmo , agradeço atodos q me ajudaram..

Poblema resolvido...
GOSTEI 0
Mysql_2013

Mysql_2013

06/10/2012

Conseguiu sanar sua duvida amigo??


Sim vlw mano

só a duvida de como executar um aplicativo externo oculto q ninguem consegui resolver

Executar oculto ja consegui de varias maneira mas mostrar o aplicativo oculto q não consegui
GOSTEI 0
Alisson Santos

Alisson Santos

06/10/2012

Qual o comando que está utilizando para fazer exibir o arquivo que está executando ocultamente.
GOSTEI 0
Mysql_2013

Mysql_2013

06/10/2012

Qual o comando que está utilizando para fazer exibir o arquivo que está executando ocultamente.


é este q estou querendo saber mano
GOSTEI 0
Alisson Santos

Alisson Santos

06/10/2012

Tentou da um show nesse formulario.
formulario.show
GOSTEI 0
Mysql_2013

Mysql_2013

06/10/2012

Tentou da um show nesse formulario.
formulario.show


não é minha propria aplicação e ssim um aplicação externa
GOSTEI 0
POSTAR