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 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
  #2  
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
  #3  
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
  #4  
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
  #5  
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
  #6  
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
  #7  
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.044
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 07:38:36.


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