Melhor forma de verif. atualizacao no sistema.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Melhor forma de verif. atualizacao no sistema.

Mensagem por marcos.gurupi »

Caros, qual eh a melhor forma de verificar c o exe do cliente eh o mais atualizado, isso eh claro via sistema, ou seja, c eu pegar a data do sistema eh simples verificar mas c houver mais d uma atualizacao no mesmo dia jah fica furado, c eu pegar por tamanho do executavel tb ficaria facil, mas c eu diminuir meu codigo fonte tb ficaria furado. Entaum estou em um dilema. Como vcs usam?


NOTA: Expressem a vontade.

Marcos Roberto
Marcos Roberto
NetService Software
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por Maligno »

Inclua no programa as informações de versão, como normalmente é feito em programas Windows.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
zazibr
Usuário Nível 2
Usuário Nível 2
Mensagens: 72
Registrado em: 11 Set 2004 17:07
Localização: Campo Grande/MS

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por zazibr »

marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por marcos.gurupi »

Sabe! Eu pensei no md5. Vou verificar o link obrigado.

Marcos Roberto.
Marcos Roberto
NetService Software
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por Maligno »

Por MD5 só será possível checar se há diferença entre os binários, mas por ele não será possível checar a seqüência da produção desses binários. Isso só mesmo por controle de versão, que é a forma realmente profissional de se fazer isso. Inclusive essa informação passa a constar na exibição das propriedades avançadas do arquivo, facilmente vista por meio do Windows Explorer. Realmente, MD5 não foi feito pra isso.

Agora, se preferir saltitar no florido campo das gambis, use uma combinação de MD5 e as datas/horas dos arquivos. Mas se for assim, nem precisa de MD5, né? :)))
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por marcos.gurupi »

Entaum alguem saberia dizer como pegar a data e a hora do arquivo?

MARCOS ROBERTO.
Marcos Roberto
NetService Software
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por Maligno »

Directory()
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por sygecom »

Eu particularmente uso um controle de versão proprio, que é bem simples mas que funciona perfeitamente para min, todos meus sistemas carrega uma numeração de versão que sempre aumenta a cada nova versão. Seria mais ou menos como esta abaixo:

Coloco no inicio da minha aplicação a seguinte linha:
Public nHandle_task := HB_BackGroundAdd( {|| Verefica_Atualizacao_Auto() }, 1000 )
// coloco em BackGround a execução pq assim da tem de iniciar os menus do sistema e depois dele todo aberto que executa a vereficação de atualização do sistema.

Código: Selecionar todos

******************************************
Function Verefica_Atualizacao_Auto
******************************************
Private oDlgHabla:=nil
MsgRun("Aguarde Procurando Atualizações do Sistema...")

IF Inetestaconectada()=.F.  //verefica se tem acesso a internet
   Fim_Run()
   Return(HB_BackGroundDel(nHandle_task)) // cancela o background
ENDIF

GravaLog("VERIFICANDO ATUALIZAÇÃO DO SISTEMA")

ftpproto ="ftp://"
ftpserver = eFTPSERVER  // caminho do FTP
ftpuser = eFTPUSER       // usuario do FTP
ftppass = eFTPPASS       // senha de acesso do FTP
curl:=ftpproto+ftpuser+":"+ftppass+"@"+ftpserver
oUrl:= turl():new(curl)
oCred:= tIPCredentials()
oFtp:= tipclientftp():NEW(oUrl,,.T.)
oFTP:nConnTimeout := 20000
oFTP:bUsePasv     := .T.
IF oFTP:Open()
   oFTP:Cwd("www/")     // muda o diretorio
   IF !empty(oFTP:List())
      clista:=oFTP:List()
      ferase("update\versao.txt")  // remove o arquivo versao.txt da pasta local update
      oFtp:DownLoadFile("update\versao.txt")  // baixa o arquivo que contem a versão atual no ftp(um TXT de apenas 4byts) baixa em um piscar de olhos
      oFTP:reset()
      oFtp:DownLoadFile("update\versao.txt")

      HAND=FOPEN("update\versao.txt") 
      VERSAODISP=FREADSTR(HAND,4) // Le os 4 primeiros bytes do aquivo baixado
      FCLOSE(HAND)
      ferase("update\versao.txt")  // deleta novamente o arquivo local que foi baixado

      IF VAL(VERSAODISP) > VAL(eCOMPILA)  // comparando a versão que foi baixada com a ATUAL
         Fim_Run()
         MsgInfo("Há uma Nova Atualização Disponivel, Favor Atualizar o Sistema.","Aviso do Sistema")   
      ENDIF
   ENDIF
   oFTP:CLOSE()
ENDIF
Fim_Run()
Return(HB_BackGroundDel(nHandle_task)) // cancela o background
Para pegar a data e hora do executavel eu uso assim:
vVERSAOATUAL:="Data e Hora da Ultima Atualização.: "+Data_Hora_ARQ(NomeExecutavel())

Obs: a função NomeExecutavel(), serve para caso o usuario tenha renomeado o EXE para outro nome, onde daria um furo se nos tentar pegar o nome do nosso EXE original: ex: Data_Hora_ARQ("sistema.exe") // isso daria o tremendo furo se o usuario renomear o EXE(comigo já aconteceu aos monte.)

Código: Selecionar todos

****************************
Function Data_Hora_ARQ(vArq)
****************************
SET CENTURY ON
SET DATE BRITISH
SET EPOCH TO 2000

aDir  := Directory( vArq )
aRet  := Transform(DtoC(aDir[1,3]),"@d")
aRet2 := aDir[1,4]
Return( aRet + " - " + aRet2 )

Function NomeExecutavel(lPath)
LOCAL nPos, cRet
If Empty(lpath)
   nPos:= RAT("\", hb_argv(0))
   cRet:= substr(hb_argv(0), nPos+1)
else
   cRet:= hb_argv(0)
endif
Return cRet
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por marcos.gurupi »

Obrigado Leonardo, diante desda aula eu consigo me virar.

Marcos Roberto.
Marcos Roberto
NetService Software
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por Maligno »

Ainda acho que o ideal (talvez para o futuro se a pressa for grande) é trabalhar com resources para armazenar esse tipo de informação, até porque, é a forma padrão, reconhecida por qualquer programa que use a API do Windows para essa finalidade.
Pra quem quiser dar uma bisbilhotada, parte do caminho das pedras está no próprio site da MSDN. Clique aqui para ver. Há outras páginas a respeito. É só pesquisar.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por sygecom »

Tambem da pra pegar do 'resources' abaixo exemplo.

Arquivo.rc

Código: Selecionar todos

#include <windows.h>

LANGUAGE LANG_PORTUGUESE,SUBLANG_PORTUGUESE_BRAZILIAN

APPLICATION_ICO ICON "res\\inco_app.ico"

1 24 "res\\WindowsXP.Manifest"

1002 BITMAP "res\\buscar.bmp"
1004 ICON   "res\\sistema.ico"

VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK 0x0
FILEFLAGS 0x0
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
{
  BLOCK "StringFileInfo"
  {
    BLOCK "041604B0"
    {
      VALUE "Comments", "Sistema Desenvolvido Pela Sygecom Informática Ltda - www.sygecom.com.br \0"
      VALUE "CompanyName", "Sygecom Informática Ltda - www.sygecom.com.br\0"
      VALUE "FileDescription", "Nomo do sistema\0"
      VALUE "FileVersion", "1.0.0.0\0"
      VALUE "InternalName", "Projeto SISTEMA\0"
      VALUE "LegalCopyright", "Sygecom Informática Ltda\0"
      VALUE "LegalTrademarks", "SISTEMA / SYGECOM\0"
      VALUE "OriginalFilename", "SISTEMA.EXE\0"
      VALUE "ProductName", "NOME DO PRODUTO\0"
      VALUE "ProductVersion", "1.0.0.0\0"
    }
  }
  BLOCK "VarFileInfo"
  {
    VALUE "Translation", 0x416, 0x4B0
  }
}
Esse arquivo.rc deve ser linkado junto com o aplicatico, se tiver usando hbmake basta colocar na linha Resource file Name: Arquivo.rc

Depois de dentro da aplicação para pegar a versão e outras opções tem que linkar a função abaixo junto com o aplicativo:

Código: Selecionar todos

#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>

HB_FUNC( GETFILEVERSIONINFO )
{
   char * szFile  = hb_parc( 1 );
   UINT uAction   = ISNUM( 2 ) ? hb_parni( 2 ) : 1;
   DWORD dwHandle = 0;
   DWORD dwSize   = GetFileVersionInfoSize( szFile, &dwHandle );
   char * szOut   = NULL;
   BOOL  bOk      = FALSE;

   if( dwSize )
   {
      char * szBlock = ( char * ) hb_xgrab( 255 );
      char * szSubBlock = ( char * ) hb_xgrab( 255 );
      HGLOBAL hMem = GlobalAlloc( GMEM_MOVEABLE, dwSize );
      VS_FIXEDFILEINFO * vsInfo;
      UINT nLen = 0;

      if( hMem )
      {
         LPVOID pMem = GlobalLock( hMem );

         if( pMem && GetFileVersionInfo( szFile, dwHandle, dwSize, pMem ) )
         {
            if( VerQueryValue( pMem, "\\VarFileInfo\\Translation", ( LPVOID * ) &vsInfo, &nLen ) )
            {
               *( LPDWORD ) vsInfo = MAKELONG( HIWORD( *( LPDWORD ) vsInfo ), LOWORD( *( LPDWORD ) vsInfo ) );

               sprintf( szBlock, "\\StringFileInfo\\%08lx\\", *( LPDWORD )( vsInfo ) );

               switch( uAction ) {
                  case 1:
                     sprintf( szSubBlock, "%s%s", szBlock, "Comments" );
                     break;

                  case 2:
                     sprintf( szSubBlock, "%s%s", szBlock, "CompanyName" );
                     break;

                  case 3:
                     sprintf( szSubBlock, "%s%s", szBlock, "FileDescription" );
                     break;

                  case 4:
                     sprintf( szSubBlock, "%s%s", szBlock, "FileVersion" );
                     break;
                  case 5:
                     sprintf( szSubBlock, "%s%s", szBlock, "InternalName" );
                     break;

                  case 6:
                     sprintf( szSubBlock, "%s%s", szBlock, "LegalCopyright" );
                     break;

                  case 7:
                     sprintf( szSubBlock, "%s%s", szBlock, "LegalTrademarks" );
                     break;

                  case 8:
                     sprintf( szSubBlock, "%s%s", szBlock, "OriginalFilename" );
                     break;

                  case 9:
                     sprintf( szSubBlock, "%s%s", szBlock, "PrivateBuild" );
                     break;

                  case 10:
                     sprintf( szSubBlock, "%s%s", szBlock, "ProductName" );
                     break;

                  case 11:
                     sprintf( szSubBlock, "%s%s", szBlock, "ProductVersion" );
                     break;

                  case 12:
                     sprintf( szSubBlock, "%s%s", szBlock, "SpecialBuild" );
                     break;
               }

               if( VerQueryValue( pMem, szSubBlock, ( LPVOID * ) &szOut, &nLen ) )
                  bOk = TRUE;

               hb_xfree( szBlock );
               hb_xfree( szSubBlock );
            }

            GlobalUnlock( hMem );
            GlobalFree( hMem );
         }
      }
   }

   if( bOk )
      hb_retc( szOut );
   else
      hb_retc( "" );
}
#pragma ENDDUMP

Function NomeExecutavel(lPath)
LOCAL nPos, cRet
If Empty(lpath)
   nPos:= RAT("\", hb_argv(0))
   cRet:= substr(hb_argv(0), nPos+1)
else
   cRet:= hb_argv(0)
endif
Return cRet
Depois para pegar as informações do EXE:
Alert(GETFILEVERSIONINFO(NomeExecutavel(),4)) // mostra a versão atual do Executavel
Alert(GETFILEVERSIONINFO(NomeExecutavel(),2)) // mostra o nome da empresa
Alert(GETFILEVERSIONINFO(NomeExecutavel(),8)) // nome original do EXE
.....
.....
.....
Obs: a Função GETFILEVERSIONINFO() foi retirada do link abaixo:
http://forums.fivetechsupport.com/viewt ... NFO#p61420
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Melhor forma de verif. atualizacao no sistema.

Mensagem por sygecom »

Esqueci de mencionar que tem que linkar a LIB version.lib para compilar o exemplo acima.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder