Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Actualización automática del archivo EXE (https://www.clubdelphi.com/foros/showthread.php?t=11972)

acalderonr 01-07-2004 08:30:35

Actualización automática del archivo EXE
 
Hola a todos.

Tengo una inquietud, y es que me gustaría hallar la manera de actualizar automáticamente el archivo EXE de mi programa en cada estación de trabajo, sin intervención del usuario.

Mi idea es la siguiente: colocar en un directorio compartido la última versión del archivo EXE y que cuando el usuario ejecute el programa en su estación de trabajo el programa mismo busque la fecha y hora de creación del archivo EXE compartido y si es más reciente, que se lo copie automáticamente. Se podrá algo así???

Sé que con GPO's de un servidor de Win2K o 2003 puedo implementar ese tipo de actualizaciones con instalaciones tipo MSI, pero me gustaría que fuera más sencillo el procedimiento, sobre todo pensando en aquellos que no tienen un servidor de esa naturaleza.

Ojalá alguien haya tenido que hacer algo parecido y pueda orientarme.

Muchas gracias

delphi.com.ar 01-07-2004 15:36:51

Cita:

Empezado por acalderonr
Mi idea es la siguiente: colocar en un directorio compartido la última versión del archivo EXE y que cuando el usuario ejecute el programa en su estación de trabajo el programa mismo busque la fecha y hora de creación del archivo EXE compartido y si es más reciente, que se lo copie automáticamente. Se podrá algo así???

Yo te diría que el usuario ejecute un programa disparador, no el exe final, que compare el EXE en el disco local contra el remoto, si el remoto es mas moderno que lo baje y ejecute, sino que directamente ejecute el EXE local.

¿No puedes ejecutar la aplicación en forma remota?

eduarcol 01-07-2004 18:37:09

Cita:

Empezado por delphi.com.ar
¿No puedes ejecutar la aplicación en forma remota?

a mi se me parece mas facil esta opcion, de hecho para evitar el problema de que hay que cerrar el sistema yo cree unas conexiones sockets y le envio al usuario la peticion de cierre si me dice espera yo monitoreo esa estacion hasta que se cierre el sistema, mientras haya un sistema abierto no actualizo

acalderonr 08-07-2004 06:19:55

Gracias delphi.com.ar y eduarcol, perdón por contestar hasta ahora, pude revisar las dos sugerencias y me parecen bastante lógicas, sobre todo la tuya delphi.com.ar, ya que en mi caso, que no trabajo en las oficinas del cliente, a mi me gustaría sólo llegar con mi cliente, copiar la actualización (o hacerlo por la vpn desde mi casa) y depositarlo en el servidor, esperando que a la mañana siguiente cuando el usuario ejecute el programa este se actualice automáticamente.

La propuesta tuya, eduarcol, también me parece buena, aunque me tendría que quedar un buen rato con el cliente hasta que se actualicen todos.

De cualquier forma muchas gracias a los dos por contestar, probaré la primera opción, aunque me surge una duda, si ejecuto un primer programa disparador, que compara las versiones, cuando manda ejecutar el programa final cómo hago para desaparecer de la memoria el disparador y que no quede residente hasta que cierre el programa final? será que en el código del programa final puedo ejecutar una sentencia para desaparecer o liberar de la memoria el disparador??

Gracias nuevamente y saludos

roman 08-07-2004 08:08:02

Cita:

Empezado por acalderonr
aunque me surge una duda, si ejecuto un primer programa disparador, que compara las versiones, cuando manda ejecutar el programa final cómo hago para desaparecer de la memoria el disparador y que no quede residente hasta que cierre el programa final? será que en el código del programa final puedo ejecutar una sentencia para desaparecer o liberar de la memoria el disparador??

No tienes que hacer nada en especial. Recuerda que cuando el programa disparador mande a ejecutar el programa final, la ejecución del disparador continúa su curso normal.

Fíjate que de hecho el programa disparador normalmente será invisible al usuario- una aplicación sin ventanas - y lo puedes programar todo en el archivo dpr del proyecto. Algo así:

Código Delphi [-]
program Disparador;

begin
  if ExisteVersionNueva then
    BajaActualizacion;

  Ejecuta;
end.

El procedimiento Ejecuta mandaría ejecutar (valga la redundancia) al programa final (por ejemplo con WinExec). Pero el flujo del programa continúa y se llega al end final con lo cual termina la aplicación y se descarga de memoria.

// Saludos

marcost 08-07-2004 21:31:29

Esto deberia servir. (He omitido todas las comprobaciones de error para hacerlo mas compacto y legible.)

Código:


procedure TForm1.FormShow(Sender: TObject);
var
cLocalExe, cReferenceExe : String;
nLocalExeTime, nReferenceExeTime : integer;
szParams : TStringList;
FileInfo: TSearchRec;
slParams : TStringList;
begin
        slParams := TStringList.Create;
        slParams.LoadFromFile ('.\appLoader.ini');
        cLocalExe := slParams.Values['LocalExe'];
        cReferenceExe := slParams.Values['ReferenceExe'];
        if (findfirst (cLocalExe, faAnyFile, FileInfo) = 0)
                then
                        nLocalExeTime := fileinfo.Time
                else
                        nLocalExeTime := 0;
        findClose (FileInfo);
        findfirst (cReferenceExe, faAnyFile, FileInfo)
        nReferenceExeTime := fileinfo.Time
        findClose (FileInfo);
        if (nReferenceExeTime > nLocalExeTime) then
                copyfile (PChar(cReferenceExe), PChar(cLocalExe), FALSE);
        shellExecute ( 0, nil, PChar(cLocalExe), '','', SW_SHOW);
        self.close;
end;

Y el archivo de configuración es algo como esto:

Apploader.ini
Código:

LocalExe="c:\miProgama.exe"
ReferenceExe="\\servidor\recurso\miPrograma.exe"

Espero que te sirva, y no te olvides añadirle todas las comprobaciones de error.

NOTA. El programa que tengo tiene una ventana que va informando al usuario de los pasos q se ejecutan, (por eso el código aparece en el FormShow), pero la idea de hacerlo con un programa sin ventana, me parece muy interesante tambien.

Suerte


La franja horaria es GMT +2. Ahora son las 00:17:11.

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