Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-04-2015
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 23-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 23-04-2015
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 23-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola lgarcia.
Cita:
Empezado por lgarcia Ver Mensaje
..., 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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 24-04-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por ecfisa Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 24-04-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por lgarcia Ver Mensaje
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?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 24-04-2015
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 24-04-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 24-04-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
A ver si te levanta algún error.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 24-04-2015
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
Cerrar aplicacion y a la vez executar otra

ok, voy a probar.
Responder Con Cita
  #11  
Antiguo 24-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 24-04-2015 a las 20:54:15. Razón: agregar comentario
Responder Con Cita
  #12  
Antiguo 24-04-2015
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cerrar otra aplicación con ventana invisible Lord Delfos API de Windows 7 23-04-2008 19:33:14
Activar una ventana al cerrar otra David OOP 3 17-09-2007 22:15:54
¿Cómo cerrar otra aplicación desde la mía? Alcolea Varios 1 22-03-2007 04:02:35
Cómo cerrar otra aplicacion desde mi aplicacion en Delphi 7 Gaby123 API de Windows 5 04-01-2007 23:44:51
Cerrar una ventana desde otra Aura OOP 9 16-05-2005 19:20:49


La franja horaria es GMT +2. Ahora son las 16:08:14.


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
Copyright 1996-2007 Club Delphi