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;
ListaDeArchivos:= ArchivosCarpeta(RutaActualizacion, '*.zip', True, False);
If ListaDeArchivos.Count > 0 Then
Begin
Actualizacion:= ListaDeArchivos.Strings[ListaDeArchivos.Count -1];
Version:= ChangeFileExt(ExtractFileName(Actualizacion), '');
Version:= Copy(Version, 11, Length(Version));
VersionActual := GetExeVersion(Directorio + Aplicacion);
VersionDisponible:= GetZipVersion(Version);
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