Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como puedo autoreiniciar mi aplicacion (https://www.clubdelphi.com/foros/showthread.php?t=64821)

pjmedina 21-04-2009 18:31:35

Como puedo autoreiniciar mi aplicacion
 
Buenas a todos,

existe alguna forma de autoreiciar una aplicacion desde delphi 7.

Quiero que se cierre la aplicacion y que se abra de nuevo.

Saludos y gracias

MAXIUM 21-04-2009 19:03:16

Con otro programa auxiliar, justo antes de que cierre la aplicación, arrancas con winexec por ejemplo, otra auxiliar. Esta se encarga de corroborar que este cerrada la aplicación principal y luego la vuelve a abrir.

Este es un ejemplo, estudialo ;)

Código Delphi [-]
program Bypass;

{$APPTYPE CONSOLE}

uses Windows;

Var
   Ventana: HWND;
Begin
  // verifica que la aplicación principal este cerrada
     Repeat
           Ventana:= FindWindow(nil, PChar('Mi aplicación principal'));
     Until Ventana = 0;

  // La vuelve a abrir.
     WinExec(PChar('aplicación.exe'), SW_HIDE);
End.

pjmedina 21-04-2009 19:06:50

Lo probaré.

Gracias por contestar.

MAXIUM 21-04-2009 19:16:41

Ojo, ese el código del archivo auxiliar.

dec 21-04-2009 20:57:36

Hola,

Prueba este truco a ver si te sirve también. ;)

roman 21-04-2009 21:28:49

David,

Pensé algo similar al truco que refieres, pero al ver la respuesta de Maxium, consideré que quizá es más adecuada, porque puede ser importante esperar a que la instancia anterior esté completamente cerrada. Por ejemplo, podríamos tenr un mecanismo para impedir la ejecución simultánea de dos instancias de la aplicación, y el hecho de que la primera ande viva todavía podría impedir el correcto reinicio.

// Saludos

Khronos 21-04-2009 22:34:58

Mediante un Mutex, Semáforo o incluso un FileMapping puedes hacer lo que deseas fácilmente ;)


Saludos.

roman 21-04-2009 22:43:02

¿Lograr qué? El reinicio de la aplicación. ¿Cómo?

// Saludos

pjmedina 22-04-2009 12:42:00

Cita:

Empezado por dec (Mensaje 345694)
Hola,

Prueba este truco a ver si te sirve también. ;)

Buenas David,

he probado el truco pero no me funciona del todo. Me cierra la aplicación pero no me la abre de nuevo.

Saludos.

pjmedina 22-04-2009 13:29:18

MAXIUM he utilizado tu código, le he hecho un par de arreglillos y va bien.

Paso el codigo por si alguien lo necesita.
Saludos y gracias por todo.

Código Delphi [-]
program Reconectar;
{$APPTYPE CONSOLE}
uses
  Windows,
  dateutils,
  SysUtils;
Var
  Ventana: HWND;
  Fini,Fact:TDateTime;
  napp,app:String;
  sg,tiempolimite:integer;
  Function CalculaTiempo(FechaIni: TDateTime; FechaFin: TDatetime):Integer;
  var
   sg:integer;
   ValorFecha: real;
  begin
    ValorFecha:=FechaFin-FechaIni;
    sg:=trunc(ValorFecha*24*60*60);
    CalculaTiempo:=sg;
  end;
Begin
  fini:=Now;
  napp:='Nombre de la aplicacion';
  app:='ejecutable.exe';
  tiempolimite:=30;//tiempo limite para la ejección del programa
   // verifica que la aplicación principal este cerrada
   Repeat
     Fact:=Now;
     sg:=CalculaTiempo(Fini,Fact);
     //sg contiene el numero de segundos transcurridos desde que se inicio la app.
     ventana:=FindWindow(nil, PChar(napp));
   Until((ventana<=0)or(sg>tiempolimite));
 
   //Si no se ha excedido el tiempo limite la vuelve a abrir.
   if sg<=tiempolimite then
      WinExec(PChar(app), SW_SHOWNORMAL);
End.

La llamada a este programa seria:
Código Delphi [-]
var
  ruta:string;
begin
  ruta:='Reconectar.exe';//Nombre de la aplicacion escrita anteriormente
  WinExec(PChar(ruta),SW_HIDE);
  close;//cerramos la aplicacion actual para volverla a abrir
end;

Khronos 22-04-2009 14:34:34

Mucho más sencillo
 
Otra forma sería así:

Código Delphi [-]
program Project1;

uses
  Windows, Forms, Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
var
  hMutex: THandle;
begin
  hMutex:= OpenMutex(MUTEX_ALL_ACCESS, false, pchar('APP'));
  If hMutex = 0 then
    begin
      CreateMutex(nil, true, pchar('APP'));
      WinExec(pchar(paramstr(0)), SW_SHOWNORMAL);
      ExitProcess(0);
    end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

EDITO: Luego en el evento OnClose del Form principal pondríamos algo así: CloseHandle(hMutex);

Saludos.

rgstuamigo 22-04-2009 21:06:17

Cita:

Empezado por pjmedina (Mensaje 345768)
Buenas David,

he probado el truco pero no me funciona del todo. Me cierra la aplicación pero no me la abre de nuevo.

Saludos.

A mi me funciona de maravilla;;):D... no se por que a vos no?:confused:
Claro que le agregue una linea de codigo mas, lo que pasa es cuando llamas nuevamente a la aplicacion para que se inicie en realidad la anterior no se cerro todavia y por tal motivo en la pantalla se visualiza aun en un cierto tiempo,por eso le agregue una linea de codigo mas al truco de dec y quedó asi:
Código Delphi [-]
Procedure ReiniciarAplicacion();
begin
 Application.MainForm.Hide;//escondo el formulario principal
 WinExec(PChar(ParamStr(0)), SW_NORMAL);
 TerminateProcess(GetCurrentProcess, 0);
end;
Funciona perfectamente y es poco codigo ¿no creen?;).
Saludos....


La franja horaria es GMT +2. Ahora son las 06:21:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi