Ver Mensaje Individual
  #6  
Antiguo 19-06-2015
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.490
Reputación: 21
MAXIUM Va camino a la fama
Post

Hola,

Bien, aquí esta el proyecto y espero ser claro en poder explicar su funcionamiento. Por otra parte, también me gustaría ayuda en depuración, ya que lo hice a la rápida y al ver que funcionaba, así quedo...

Bueno, el asunto es que tengo varias estaciones de trabajo con una aplicación que conecta a la base de datos de un servidor. Todo en forma local por LAN. El problema surge cuando hago actualizaciones del sistema y tengo que ir estación por estación haciendo esto. Así que cree esta aplicación que me resuelve el problema.

Lo otro que se me ocurrió, es que fuera "universal". Es decir, sin necesidad de estar compilando en cada nuevo proyecto. Solo coloco el ejecutable, le creo un acceso directo en el escritorio, le cambio el icono y modifico los parámetros del archivo INI que se adjunta y listo.

Bueno, ¿como funciona? Como explique, la aplicación que creen no se ejecuta directamente, sino que primero el actualizador que actúa como Launcher "universal". Entonces al arrancar el Launcher, este toma la versión del ejecutable a actualizar (importante activar la opción de incluir la versión del exe en las opciones del compilador) y la compara con el "nombre" del archivo en el servidor que contiene la actualización.

Ejemplo:
Si mi aplicación se llama ClubDelphi.exe y su versión es 1.0.0.0 Al ejecutar el launcher toma esta versión y la compara con el "nombre" del archivo que esta en el servidor y que se llama "update_to_1.0.0.102.zip" Si esta es mayor, la descarga, la descomprime y ejecuta un script contenido en el zip, el cual se encarga de reemplazar los archivos que especifiquemos o cualquier otra operación adicional. Este script, es del tipo VBS. Finalmente, ejecuta la aplicación y cierra el launcher.

Notas:
- El launcher y su archivo .ini, deben estar en el mismo directorio que contiene el ejecutable de sus aplicaciones.
- El ejecutable de sus aplicaciones, deben contener la versión.
- En el escritorio crean un acceso directo DEL launcher y le cambian el icono y nombre por el de sus aplicaciones o el que estimen conveniente.
- El servidor debe tener una carpeta compartida y con permisos, donde albergara la actualización.
- El archivo que contienen las actualizaciones, debe estar comprimido en zip con el nombre bajo el siguiente ejemplo update_to_1.2.0.357.zip
- El archivo que contienen las actualizaciones, debe contener un archivo scritp bajo el siguiente nombre script.vbs

Formato del archivo INI que se adjunta
Cita:
[RUTA]
; Ruta que contiene la actualización.
Actualizacion=\\SistemaUno\Actualizaciones

[VERSION]
; Aplicación con la que se desea comparar con la actualización disponible.
Ejecutable=ClubDelphi.exe
Formato del archivo script que se adjunta. Puede agregar más opciones a este si lo desean y bajo sus necesidades
Cita:
Set objfso = createobject("scripting.filesystemobject")
Objfso.copyfile ".\Temp\*.exe", ".\", true
Objfso.deletefolder ".\Temp"
Estructura principal
Código Delphi [-]
Begin
     ShowWindow(GetConsoleWindow, SW_HIDE);

     Directorio := ExtractFilePath(Application.ExeName);

     LauncherINI:= TIniFile.Create(Directorio + 'Launcher.ini');
     Try
        RutaActualizacion:= LauncherINI.ReadString('RUTA'   , 'Actualizacion', '');
        Aplicacion       := LauncherINI.ReadString('VERSION', 'Ejecutable'   , '');
     Finally
        LauncherINI.Free;
     End;

  // Verifica si hay archivos de actualizaciones dispobibles.
     ListaDeArchivos:= ArchivosCarpeta(RutaActualizacion, '*.zip', True, False);
     If ListaDeArchivos.Count > 0 Then
     Begin
       // Lee los nombres de las actualizaciones disponibles y escoje la última (más reciente).
          Actualizacion:= ListaDeArchivos.Strings[ListaDeArchivos.Count -1];

       // Extrae la numeración de la actualización disponible.
          Version:= ChangeFileExt(ExtractFileName(Actualizacion), '');
          Version:= Copy(Version, 11,  Length(Version));

       // Almacena los valores de ambas versiones en vectores.
          VersionActual    := GetExeVersion(Directorio + Aplicacion);
          VersionDisponible:= GetZipVersion(Version);

       // Comprueba si la actualización es reciente.
          Actualizar:= False;
          Indice    := 1;
          Repeat
                If (VersionDisponible[Indice] > VersionActual[Indice]) Then
                Begin
                    Actualizar:= True;
                    Indice    := 5;
                End
                Else If (VersionDisponible[Indice] = VersionActual[Indice]) Then
                    Inc(Indice)
                Else
                    Indice:= 5;
          Until Indice = 5;

          If Actualizar Then
          Begin
               If Not DirectoryExists(Directorio + 'Temp') Then CreateDir(Directorio + 'Temp') ;

               ShellUnzip(Actualizacion, Directorio + 'Temp');

               WinExecAndWait32(DirectorioSistema + '\wscript.exe ' + GetShortName(Directorio + 'Temp\script.vbs'), SW_SHOWNORMAL)
          End;
     End;
     
     FreeAndNil(ListaDeArchivos);

     WinExec(PChar(Directorio + Aplicacion),SW_SHOWNORMAL);
End.

Cualquier consulta, quedo atento
Archivos Adjuntos
Tipo de Archivo: zip Update.zip (36,0 KB, 32 visitas)

Última edición por MAXIUM fecha: 19-06-2015 a las 21:59:57.
Responder Con Cita