Cada vez mais programas oferecem suporte a funções de atualização on-line. Este artigo apresenta como obter informações de atualização no site. Aqui eu uso principalmente informações de versão para detectar se preciso baixar uma versão atualizada.
O princípio geral é o seguinte:
1. Coloque texto informativo no site.
2. Use TNMHTTP para obter conteúdo de texto do texto informativo do site.
3. Analise as informações necessárias para análise de texto.
4. Compare as versões do programa para fornecer informações de atualização.
Primeiramente, colocamos um texto informativo em nosso site. Este texto possui um formato de arquivo próprio.
[atualizar]
<ver>1.79.9.25</ver>
<url>http://delphibox.com/softm/3_update.zip</url>
<data>25/09/2002</data>
[/atualizar]
Podemos salvá-lo como um arquivo update.txt e usar o identificador []<> para classificar as informações, que inclui o nome do programa, versão, data de atualização e endereço de download. Aqui, suponho que faça o upload para http://2ccc.com/update.txt.
Em seguida, usamos o componente TNMHTTP para obter o conteúdo deste arquivo do site:
função TForm1.GetUpdateText:String;
começar
NMHTTP1.InputFileMode := FALSO;
NMHTTP1.OutputFileMode := FALSO;
NMHTTP1.ReportLevel := Status_Basic;
NMHTTP1.Get('http://2ccc.com/update.txt'); {Obter texto do site}
Resultado:=NMHTTP1.Body;
fim;
Após obter o texto, precisamos separar as informações utilizei a seguinte função:
função TForm1.AnalyseUpdate(Body:String;var Update:TUpdate):Boolean;
var
TmpStr,Ver:String;
função CenterStr(Src:String;Antes,Depois:String):String;
{Esta função é usada para separar a string no meio de duas strings.
Por exemplo..('DelphiBox.com','Delphi','.com')=>'Box'. }
var
Pos1,Pos2:Palavra;
começar
Pos1:=Pos(Antes,Src)+Comprimento(Antes);
Pos2:=Pos(Depois,Src);
Resultado:=Copiar(Src,Pos1,Pos2-Pos1);
fim;
começar
TmpStr:=CenterStr(Body,'update'); {Obtém as informações de atualização entre os nomes dos programas}
se TmpStr='' então
Resultado:=Falso else {Não é possível encontrar esta informação de atualização de arquivo}
começar
Ver:=CenterStr(TmpStr,'<ver>','</ver>');
Update.Version:=SeparateVerStr(Ver); {analisar versão}
Update.Date:=StrToDate(CenterStr(TmpStr,'<date>','</date>')); { Analisar data}
Update.URL:=CenterStr(TmpStr,'<url>','</url>'); {Resolver endereço de atualização}
Resultado:=Verdadeiro;
fim;
fim;
Onde TUpdate é o formato de gravação das informações que defini:
TSimpleVersion=record{Informações da versão simplificada}
dwPRoductVersionMS: DWORD;{versão principal}
dwProductVersionLS: DWORD;{versão secundária}
fim;
TUpdate=registro {informações de atualização}
Nome:String[63];{nome do programa}
Versão:TSimpleVersion;{versão}
Data:TDate;{data}
URL:ShortString;{endereço de download}
fim;
A função SeparateVerStr() converte as informações da versão atualizada em formato de string em um formato simplificado de informações da versão:
função SeparateVerStr(s:String):TSimpleVersion;
const
Separador='.'; {pense em '.'
var
p,v1,v2,v3,v4:PALAVRA;
começar
se Comprimento(s)=0 então Sair;
p:=pos(Separador, s);
v1:=StrToInt(cópia(s,1,p-1));
Excluir(s,1,p);
p:=Pos(Separador,s);
v2:=StrToInt(cópia(s,1,p-1));
Excluir(s,1,p);
p:=Pos(Separador,s);
v3:=StrToInt(cópia(s,1,p-1));
Excluir(s,1,p);
v4:=StrToInt(s);
Resultado.dwProductVersionMS:=v1*$10000+v2;
Resultado.dwProductVersionLS:=v3*$10000+v4;
fim;
A última coisa a fazer é comparar as informações de versão dos arquivos e primeiro obter sua própria versão. Eu uso a seguinte função:
function GetBuildInfo(FName:string):TSimpleVersion; {obter informações da própria versão}
var
VerInfoSize: DWORD;
VerInfo: Ponteiro;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Manequim: DWORD;
começar
VerInfoSize := GetFileVersionInfoSize(PChar(FName), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '/', Ponteiro(VerValue), VerValueSize);
com VerValue ^ faça
começar
Result.dwProductVersionMS := dwFileVersionMS;
Result.dwProductVersionLS := dwFileVersionLS; {versão secundária}
fim;
FreeMem(VerInfo, VerInfoSize);
fim;
Em seguida, use a seguinte função para comparar a versão atualizada do site com a versão atual. Se TRUE for retornado, significa que há uma nova versão do arquivo:
função VersionCheck(OriVer,NewVer:TSimpleVersion):Boolean;
começar
se (OriVer.dwProductVersionMS=NewVer.dwProductVersionMS) então
começar
Resultado:=OriVer.dwProductVersionLS<NewVer.dwProductVersionLS;
fim mais
começar
Resultado:=OriVer.dwProductVersionMS<NewVer.dwProductVersionMS
fim;
fim;