Ver Mensaje Individual
  #11  
Antiguo 24-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 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 19:54:15. Razón: agregar comentario
Responder Con Cita