Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Cerrar aplicacion y a la vez executar otra. (https://www.clubdelphi.com/foros/showthread.php?t=88181)

lgarcia 23-04-2015 17:22:26

Cerrar aplicacion y a la vez executar otra.
 
Hola:

Estoy trabajando en un actualizador de programas, que consta de 2 programas, el 1ro que es el principal que cuando el usuario se autentifica hace un chequeo de la version y si esta es menor te envia un mensaje de aviso se cierra y mandar a ejecutar el actualizador, que lo que hace es copiar desde un Path la nueva version para el directorio de trabajo. El actualizador solo trabaja perfectamente. Pero cuando cierro el programa se levanta el actualizador pero se cae sin terminar de actualizar. Esre es el codigo. Utilizo Deplhi 7.

Código Delphi [-]
  numero:= 110;
  with Version do
  begin
     Close;
     Open;
  end;
  if numero < Versionnumero.Value then
   begin
      ShowMessage('There is a new Version of the software' + chr(13) + 'The program will close to update it');
      Close;
      WinExec(PChar('C:\Ezdealers\Updater\Actualizador.exe'),SW_SHOWNORMAL);
   end
   else
      try
        Application.CreateForm(TFormMain, FormMain);
        FormMain.ShowModal;
     finally
       FormMain.Free;
    end;

Saludos
Luis Garcia

ecfisa 23-04-2015 19:23:29

Hola lgarcia.

En la parte del código que mostras, la línea de WinExec nunca se ejecuta ya que llamas al método Close en la línea previa.

De todos modos pienso que es el programa actualizador quién debería evaluar la versión y de ser necesario, realizar las tareas de actualización.

Saludos :)

lgarcia 23-04-2015 20:14:09

Cerrar aplicacion y a la vez executar otra.
 
Muchas gracias eficsa por tu respuesta, con relacion a lo que me recomiendas de que el actualizador es el que debia lanzarse 1ro, el problemas es que la comparacion del numero de la version es a traves de una consulta a una tabla de la BD, por lo que antes necesito autenticarme para comprobar las versiones.

ecfisa 23-04-2015 20:23:17

Hola lgarcia.
Cita:

Empezado por lgarcia (Mensaje 491651)
..., el problemas es que la comparacion del numero de la version es a traves de una consulta a una tabla de la BD, por lo que antes necesito autenticarme para comprobar las versiones.

Entonces podrías verificar la versión y de ser necesario llamar al actualizador para que este último la cierre, la actualize y luego vuelva a ejecutarla. Eso sí, deberá autenticarse nuevamente...

Saludos :)

Neftali [Germán.Estévez] 24-04-2015 11:00:22

Cita:

Empezado por ecfisa (Mensaje 491648)
En la parte del código que mostras, la línea de WinExec nunca se ejecuta ya que llamas al método Close en la línea previa.

Yo creo que no.
El Close, realiza las tareas necesarias para cerrar el formulario, pero no detiene la ejecución del código.

Creo que en muchos casos (si no en todos) el WinExec sí se ejecuta.

Basta con poner un botón con el siguiente código:

Código Delphi [-]
    ShowMessage('There is a new Version of the software' + chr(13) + 'The program will close to update it');
    Close;
    WinExec(PChar('notepad.exe'), SW_SHOWNORMAL);

Y veremos que el Notepad se abre.

Neftali [Germán.Estévez] 24-04-2015 11:02:15

Cita:

Empezado por lgarcia (Mensaje 491641)
El actualizador solo trabaja perfectamente. Pero cuando cierro el programa se levanta el actualizador pero se cae sin terminar de actualizar. Esre es el codigo. Utilizo Deplhi 7.

Entonces el problema está en el actualizador, el código que pones está funcionando correctamente, pues el actualizador se abre.
Deberías explicar mejor que hace este segundo programa.

¿Es posible que el actualizador haga alguna operación y el programa principal todavía esté funcionando y por eso falla?

lgarcia 24-04-2015 15:58:50

Cerrar aplicacion y a la vez executar otra
 
gracias por la respuesta Neftali

el codigo del actualizador es el siguiente:

Código Delphi [-]
procedure TFormMain.FormActivate(Sender: TObject);
begin
  CopyFile(Pchar('\\192.168.0.25\Upload\EZDealers.exe'), Pchar('C:\Ezdealers\EZDealers.exe'), False);
  Close;
  WinExec(PChar('C:\Ezdealers\EZDealers.exe'),SW_SHOWNORMAL);
end;

Saludos
Luis

Neftali [Germán.Estévez] 24-04-2015 16:52:16

Añádele un try..except para detectar posibles problemas.
Algo Así:

Código Delphi [-]
procedure TFormMain.FormActivate(Sender: TObject);
begin
  try
     If CopyFile(Pchar('\\192.168.0.25\Upload\EZDealers.exe'), Pchar('C:\Ezdealers\EZDealers.exe'), False) then
       ShowMessage('Copia correcta')
     else
       RaiseLastOSError;
     
     Close;
     WinExec(PChar('C:\Ezdealers\EZDealers.exe'),SW_SHOWNORMAL);
  except
    on E:Exception do begin
      MessageDlg('Error al actualizar; ' + E.Message, mtError, [mbOK], 0);
    end;
  end;
end;

Neftali [Germán.Estévez] 24-04-2015 16:54:26

A ver si te levanta algún error.

lgarcia 24-04-2015 17:12:16

Cerrar aplicacion y a la vez executar otra
 
ok, voy a probar.

ecfisa 24-04-2015 17:40:21

Hola lgarcia.

Si entendí bien, deseas copiar otra version de la aplicación llamando desde esta misma a un actualizador que sobreescribirá una nueva versión de la misma.

El problema es, que mientras la aplicación se esté ejecutando, el s.o. no permitirá que sobreescribas su archivo ejecutable. Y por otro lado, no veo manera que la aplicación ejecute al actualizador cuando no se está ejecutando (ya esta cerrada).

Yo me refería a que hicieras algo parecido a este ejemplo,

Aplicación:
Código Delphi [-]
...
implementation

uses ShellApi;

function NecesitaActualizar(): Boolean;
begin
  // verificar si necesita actualizar
  Result:= True;
end;

procedure TForm1.btnActualizarClick(Sender: TObject);
begin
  if NecesitaActualizar() then
  begin
    // Cerrar y/o liberar lo necesario
    ShellExecute(Handle,
                 'open',
                 'Actualizador.exe',
                 nil,
                 nil,
                 SW_SHOWNORMAL);
  end;
end;
...

Actualizador:
Código Delphi [-]
...
implementation 

uses tlhelp32, ShellApi;

procedure CloseApplication(const ExeFileName: string);
var
  Entry: PROCESSENTRY32;
  hSnapShot, hProcess: THandle;
begin
  hSnapShot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  Entry.dwSize:= SizeOf(PROCESSENTRY32);
  if Process32First(hSnapShot, Entry) then
    while Process32Next(hSnapShot, Entry) do
      if Entry.szExeFile = ExeFileName then
      begin
        hProcess := OpenProcess(SYNCHRONIZE + PROCESS_TERMINATE,
                                False,
                                Entry.th32ProcessID);
        if hProcess <> 0 then
          TerminateProcess(hProcess, 0);
        CloseHandle(hProcess);
      end;
end;

procedure Actualizar;
begin
  // aquí iría el proceso de actualización
  Sleep(4000); 
  ShowMessage('Actualización terminada');
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  CloseApplication('Aplicacion.exe');
  Actualizar;
  ShellExecute(Handle,
               'open',
               'Aplicacion.exe',
               nil,
               nil,
               SW_SHOWNORMAL);
  Close;
end;
...

Saludos :)

lgarcia 24-04-2015 19:17:43

Cerrar aplicacion y a la vez executar otra
 
Todo quedo Estelar con la última contribución de Ecfisa.

Muchas gracias a todos y saludos.

Saludos
Luis Garcia


La franja horaria es GMT +2. Ahora son las 09:30:50.

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