Melhor forma de verif. atualizacao no sistema.
Moderador: Moderadores
-
marcos.gurupi
- 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.
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
NOTA: Expressem a vontade.
Marcos Roberto
Marcos Roberto
NetService Software
NetService Software
Re: Melhor forma de verif. atualizacao no sistema.
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!
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

- Mensagens: 939
- Registrado em: 06 Jul 2004 11:53
- Localização: Gurupi-TO
Re: Melhor forma de verif. atualizacao no sistema.
Sabe! Eu pensei no md5. Vou verificar o link obrigado.
Marcos Roberto.
Marcos Roberto.
Marcos Roberto
NetService Software
NetService Software
Re: Melhor forma de verif. atualizacao no sistema.
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é?
))
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!
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

- Mensagens: 939
- Registrado em: 06 Jul 2004 11:53
- Localização: Gurupi-TO
Re: Melhor forma de verif. atualizacao no sistema.
Entaum alguem saberia dizer como pegar a data e a hora do arquivo?
MARCOS ROBERTO.
MARCOS ROBERTO.
Marcos Roberto
NetService Software
NetService Software
Re: Melhor forma de verif. atualizacao no sistema.
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!
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!
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Melhor forma de verif. atualizacao no sistema.
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.
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.)
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
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 cRetLeonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
marcos.gurupi
- 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.
Obrigado Leonardo, diante desda aula eu consigo me virar.
Marcos Roberto.
Marcos Roberto.
Marcos Roberto
NetService Software
NetService Software
Re: Melhor forma de verif. atualizacao no sistema.
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.
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!
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!
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Melhor forma de verif. atualizacao no sistema.
Tambem da pra pegar do 'resources' abaixo exemplo.
Arquivo.rc
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:
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
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
}
}
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
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
xHarbour.org + Hwgui + PostgreSql
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Melhor forma de verif. atualizacao no sistema.
Esqueci de mencionar que tem que linkar a LIB version.lib para compilar o exemplo acima.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql

