Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-06-2015
jofebas jofebas is offline
Miembro
 
Registrado: nov 2010
Posts: 50
Poder: 14
jofebas Va por buen camino
Question Actualizar exe Cliente-Servidor

Hola a todos.
Les comento.
Tengo una aplicación donde el ejecutable lo pongo en el servidor y las PCs tienen un acceso directo en su escritorio, al modificar el ejecutable todos pueden ver las actualizaciones, el problema es que también hay laptops donde tienen el ejecutable en su escritorio ya que tienen que viajar y se conectar por internet, el problema con ellos radica en que al hacer actualizaciones no la pueden ver hasta que les mando el nuevo o llegan y lo sustituyen.
¿Existe una manera de crear un ejecutable que llame a otro o que detecte si la versión es más nueva y se actualice solo?
Ya le estuve buscando y creo que estoy perdido.
Si pudieran ayudarme.
Gracias.
Responder Con Cita
  #2  
Antiguo 19-06-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 jofebas.

Revisa si te puede servir lo comentado en este hilo: Cerrar aplicacion y a la vez executar otra..

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 19-06-2015
jofebas jofebas is offline
Miembro
 
Registrado: nov 2010
Posts: 50
Poder: 14
jofebas Va por buen camino
Gracias lo estoy revisando
Responder Con Cita
  #4  
Antiguo 19-06-2015
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
Justo tengo un proyecto que funciona así y anda bastante bien.

Lo subo a la noche con código fuente y todo para que me ayuden a optimizarlo.
Responder Con Cita
  #5  
Antiguo 19-06-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
MAXIUM,

Cita:
Empezado por MAXIUM
...tengo un proyecto que funciona así...Lo subo a la noche con código fuente...


Nelson.
Responder Con Cita
  #6  
Antiguo 19-06-2015
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
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
  #7  
Antiguo 19-06-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #8  
Antiguo 20-06-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
Muchas gracias por el aporte MAXIUM

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 22-06-2015
jofebas jofebas is offline
Miembro
 
Registrado: nov 2010
Posts: 50
Poder: 14
jofebas Va por buen camino
Muchas gracias.

Lo estoy probando, cualquier cosa comentare.

De nuevo muchas gracias.
Responder Con Cita
  #10  
Antiguo 30-06-2015
jofebas jofebas is offline
Miembro
 
Registrado: nov 2010
Posts: 50
Poder: 14
jofebas Va por buen camino
Resuelto

hola buenos días.
como no soy muy experto aun en cosas de manejo de archivos y el api y cosas así, o resolví de la siguiente manera.

primero: cree una tabla donde subí el ejecutable como blob y ahí puse la versión en otro campo.
segundo: hice otra aplicación que es que actualizaría la primera o la principal.
el procedimiento es el siguiente:

al abrir el programa, en el evento on_create puse la validación de la versión, si la que tiene la aplicación es diferente a la de la base, abre el actualizador con derechos de administrador y se cierra para que se pueda sustituir el ejecutable.
cuando se abre el actualizador, descarga la el exe que esta en la base (que ya había cargado anteriormente con la versión mas actualizada), al descargarla, crea un acceso directo en el escritorio y lo manda abrir, su cierra el actualizador y listo.

puede funcionar tanto dentro de la lan como en internet, ya que los dos sistemas tienen la validación de la conexión para saber a que servidor conectarse.

aunque la parte de la descarga en un ambiente externo es mas lenta, pero funciona.

bueno espero les de una idea si es que alguien la necesita.

no utilice el scrib MAXIMUN ya que no lo comprendo y no se aun como utilizarlo , pero gracias a todos.
Responder Con Cita
  #11  
Antiguo 30-06-2015
alquimista alquimista is offline
Miembro
 
Registrado: ene 2008
Posts: 203
Poder: 17
alquimista Va por buen camino
¿Y si el archivo que se descarga de internet llega corrupto?
Me suena que esto se ha tratado anteriormente...

Yo hice algo parecido y creaba un archivo con un hash md5

se descargaba desde internet el exe y un txt con la versión y el hash
y asi aseguraba también la descarga correcta.
Código Delphi [-]
......
Var
 nombreup,NombreExe : string;
 TS:TStrings;
 Str, md5hash,md5dest :String;
 pathversion:string;
  Begin
      NombreExe:=ExtractFilepath( Application.ExeName )+'svcgk.exe';
      nombreup:=ExtractFilepath( Application.ExeName )+'svcgk.tmp';
      pathversion:=ExtractFilePath(ParamStr(0))+'version.txt';
      // comparar hash y versión
          TS := TStringList.Create();
          // Coger la version
          try
            TS.LoadFromFile(pathversion);
            Str := TS[0];
            md5hash :=UpperCase(TS[1]);
          except
            try
              ShellExecute(form6.Handle, 'open', PAnsiChar(NombreExe){'svcgk.exe'}, nil, nil,
                 SW_SHOWNORMAL) ;
             Application.Terminate;
            except
              // si hay error intenta abrir otra vez
               ShellExecute(form6.Handle, 'open',PAnsiChar(NombreExe){'svcgk.exe'}, nil, nil,
                 SW_SHOWNORMAL) ;
             Application.Terminate;
            end;
          end;
     md5Dest:=UpperCase(CheckSum(nombreup)); // rutina de otra unidad hashes que compueba el md5
     if md5hash=md5dest then
       begin
         EnablePrivilege('SeDebugPrivilege', TRUE); 
         KillTask('svcgk.exe'); //destruye la tarea
         Sleep(10000); // espero estos 10 segundos para que de tiempo de sobra
         md5Dest:=UpperCase(CheckSum(nombreExe));
         if (md5hash<>md5dest) And
            (copyfile (pchar (Nombreup), Pchar (NombreExe),false)) then
                try
                   DELETEFILE(nombreup);
                   DELETEFILE(pathversion);
                except

                end;
      end;

     ShellExecute(form6.Handle, 'open', PAnsiChar(NombreExe){'svcgk.exe'}, nil, nil, SW_SHOWNORMAL) ;
     Application.Terminate;

Esto es una parte de lo que hice hace tiempo y funcionaba (falta la unidad hasshesy alguna parte de código era por mostrar la comprobación de md5.
Creo que saque ideas de aquí pero fue hace mas de 5 años y casi no me acuerdo

Añado unit hashes que no se ni de donde lo saque..
Código Delphi [-]
unit hashes;

interface

uses Windows, SysUtils, Classes;

function CheckSum(Stream: TStream): string; overload;
function CheckSum(Archivo: string): string; overload;
function StrCheckSum(Str: string): string;

implementation

type
  HCRYPTPROV = ULONG;
  PHCRYPTPROV = ^HCRYPTPROV;
  HCRYPTKEY = ULONG;
  PHCRYPTKEY = ^HCRYPTKEY;
  HCRYPTHASH = ULONG;
  PHCRYPTHASH = ^HCRYPTHASH;
  LPAWSTR = PAnsiChar;
  ALG_ID = ULONG;

const
  CRYPT_NEWKEYSET = $00000008; 
  PROV_RSA_FULL = 1;
  ALG_TYPE_ANY = 0;
  ALG_CLASS_HASH = (4 shl 13);
  ALG_SID_MD5 = 3;
  CALG_MD5 = (ALG_CLASS_HASH or ALG_TYPE_ANY or ALG_SID_MD5);
  HP_HASHVAL = $0002;

function CryptAcquireContext(phProv: PHCRYPTPROV;
  pszContainer: LPAWSTR;
  pszProvider: LPAWSTR;
  dwProvType: DWORD;
  dwFlags: DWORD): BOOL; stdcall;
  external ADVAPI32 name 'CryptAcquireContextA';

function CryptCreateHash(hProv: HCRYPTPROV;
  Algid: ALG_ID;
  hKey: HCRYPTKEY;
  dwFlags: DWORD;
  phHash: PHCRYPTHASH): BOOL; stdcall;
  external ADVAPI32 name 'CryptCreateHash';

function CryptHashData(hHash: HCRYPTHASH;
  const pbData: PBYTE;
  dwDataLen: DWORD;
  dwFlags: DWORD): BOOL; stdcall;
  external ADVAPI32 name 'CryptHashData';

function CryptGetHashParam(hHash: HCRYPTHASH;
  dwParam: DWORD;
  pbData: PBYTE;
  pdwDataLen: PDWORD;
  dwFlags: DWORD): BOOL; stdcall;
  external ADVAPI32 name 'CryptGetHashParam';

function CryptDestroyHash(hHash: HCRYPTHASH): BOOL; stdcall;
  external ADVAPI32 name 'CryptDestroyHash';

function CryptReleaseContext(hProv: HCRYPTPROV; dwFlags: DWORD): BOOL; stdcall;
  external ADVAPI32 name 'CryptReleaseContext';

function CheckSum(Stream: TStream): string; overload;
var
  hProv: HCRYPTPROV;
  hHash: HCRYPTHASH;
  Buffer: PByte;
  BytesRead: DWORD;
  Data: array[1..16] of Byte;
  DataLen: DWORD;
  Success: BOOL;
  i: integer;
begin
  Result:= EmptyStr;
  Success := CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, 0);
  if (not Success) then
    if GetLastError() = DWORD(NTE_BAD_KEYSET) then
      Success := CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL,
        CRYPT_NEWKEYSET);
  if Success then
  begin
    if CryptCreateHash(hProv, CALG_MD5, 0, 0, @hHash) then
    begin
      GetMem(Buffer,10*1024);
      try
        while  TRUE do
        begin
          BytesRead:= Stream.Read(Buffer^, 10*1024);
          if (BytesRead = 0) then
          begin
            DataLen := Sizeof(Data);
            if (CryptGetHashParam(hHash, HP_HASHVAL, @Data, @DataLen, 0)) then
              for i := 1 to 16 do
                Result := Result + LowerCase(IntToHex(Integer(Data[i]), 2));
            break;
          end;
          if (not CryptHashData(hHash, Buffer, BytesRead, 0)) then
            break;
        end;
      finally
        FreeMem(Buffer);
      end;
      CryptDestroyHash(hHash);
    end;
    CryptReleaseContext(hProv, 0);
  end;
end;

function CheckSum(Archivo: string): string; overload;
var
  Stream: TFileStream;
begin
  Result:= EmptyStr;
  if FileExists(Archivo) then
  try
    Stream:= TFileStream.Create(Archivo,fmOpenRead or fmShareDenyWrite);
    try
      Result:= CheckSum(Stream);
    finally
      Stream.Free;
    end;
  except end;
end;

function StrCheckSum(Str: string): string;
var
  Stream: TStringStream;
begin
  Result:= EmptyStr;
  Stream:= TStringStream.Create(Str);
  try
    Result:= CheckSum(Stream);
  finally
    Stream.Free;
  end;
end;

end.

Última edición por alquimista fecha: 30-06-2015 a las 17:54:18.
Responder Con Cita
  #12  
Antiguo 01-07-2015
jofebas jofebas is offline
Miembro
 
Registrado: nov 2010
Posts: 50
Poder: 14
jofebas Va por buen camino
bueno lo que pasa es que el archivo que descargo es un ejecutable que guardo en la base de datos, en una tabla, lo guardo como tipo BOLB
y ese ejecutable lo subo desde el mismo sistema.

lo he probado y hasta ahora me ha funcionado, si pasa algo, se los comento.
Responder Con Cita
  #13  
Antiguo 01-07-2015
jofebas jofebas is offline
Miembro
 
Registrado: nov 2010
Posts: 50
Poder: 14
jofebas Va por buen camino
lo subo a una tabla de mysql con Zeos este el el código

Código Delphi [-]
  if not (ZQuery.State in [dsedit, dsinsert]) then
  begin
    ZQuery.Edit;
    ZQuery.Append;
    Try
        ZQuerynombre.AsString := Edit1.Text;
        ZQueryfecha.AsDateTime := Date1.Date;
        ZQueryprog.LoadFromFile('Ruta del *.exe');
        ZQuery.Post;
          finally

      end;
      ShowMessage('--- OK ---');
      ZQuery.Close;

y así lo bajo

Código Delphi [-]
  ZQuery.Open;
  ZQuery.First;
  ZQueryPROG.SaveToFile('ruta del archivo');
Responder Con Cita
  #14  
Antiguo 01-07-2015
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Precisamente tengo un proyecto para el futuro en mi nuevo curro (a ver cuándo os informo bien, que a más de uno le gustará) en el que necesito precisamente eso. Por desgracia no nos podemos permitir un Delphi (salvo mi vieja copia de Delphi 6, que no sé si funcionará con los nuevos Windows) así que tengo que tirar de Lazarus y Free Pascal. Por desgracia, lo único que encontré para este compilador necesita muchísismas dependencias, y no cierra la aplicación llamante sino que esta queda en suspenso hasta que la aplicación llamada termina.

Ahora mismo ando liado y no puedo comprobarlo, pero sería genial si la solución de MAXIUM también funcionara con Free Pascal, y si también funcionara en Linux, MacOS e iOS ya sería la repanocha.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 01-07-2015 a las 11:11:01.
Responder Con Cita
  #15  
Antiguo 02-07-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por Ñuño Martínez Ver Mensaje
(salvo mi vieja copia de Delphi 6, que no sé si funcionará con los nuevos Windows)
Deberias probar porque por ejemplo las aplicaciones que hago con delphi 2010 andan sin problema en windows 10; no creo que haya casi problemas
Responder Con Cita
  #16  
Antiguo 02-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por AgustinOrtu Ver Mensaje
Deberias probar porque por ejemplo las aplicaciones que hago con delphi 2010 andan sin problema en windows 10; no creo que haya casi problemas
Seguro que funciona, aunque delphi 6 es de hace unos 15 años
Responder Con Cita
Respuesta



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
Actualizar en el cliente con FIBPlus, Como? El_Raso Conexión con bases de datos 4 06-02-2013 23:15:10
cliente servidor kapcomx Conexión con bases de datos 2 28-08-2007 22:48:25
actualizar aplicacion cliente en varios puesto VRO Providers 0 25-10-2005 18:00:49
Problema:Cliente/Servidor.Actualizar clientes automaticamente. aoiTo Conexión con bases de datos 5 04-08-2004 06:02:27
Actualizar sólo 1 registro en cliente/servidor Rufus Conexión con bases de datos 7 21-06-2004 12:02:14


La franja horaria es GMT +2. Ahora son las 05:21:44.


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