Cada vez más programas admiten funciones de actualización en línea. Este artículo presenta cómo obtener información de actualización desde el sitio web. Aquí utilizo principalmente información de la versión para detectar si necesito descargar una versión actualizada.
El principio general es el siguiente:
1. Coloque texto informativo en el sitio web.
2. Utilice TNMHTTP para obtener contenido de texto del texto de información del sitio web.
3. Analice la información necesaria para el análisis del texto.
4. Compare las versiones del programa para proporcionar información de actualización.
Primero, colocamos un texto informativo en nuestro sitio web. Este texto tiene su propio formato de archivo. Definí el siguiente formato:
[actualizar]
<ver>1.79.9.25</ver>
<url>http://delphibox.com/softm/3_update.zip</url>
<fecha>2002-9-25</fecha>
[/actualizar]
Podemos guardarlo como un archivo update.txt y usar el identificador []<> para clasificar la información, que incluye el nombre del programa, la versión, la fecha de actualización y la dirección de descarga. Aquí supongo que lo subo a http://2ccc.com/update.txt.
Luego utilizamos el componente TNMHTTP para obtener el contenido de este archivo del sitio web:
función TForm1.GetUpdateText:String;
comenzar
NMHTTP1.InputFileMode: = FALSO;
NMHTTP1.OutputFileMode: = FALSO;
NMHTTP1.ReportLevel:= Estado_Básico;
NMHTTP1.Get('http://2ccc.com/update.txt'); {Obtener texto del sitio web}
Resultado:=NMHTTP1.Cuerpo;
fin;
Después de obtener el texto, necesitamos separar la información. Utilicé la siguiente función:
función TForm1.AnalyseUpdate(Body:String;var Update:TUpdate):Boolean;
var
TmpStr,Ver:Cadena;
función CenterStr(Src:String;Antes,Después:String):String;
{Esta función se utiliza para separar la cadena en medio de dos cadenas.
Por ejemplo...('DelphiBox.com','Delphi','.com')=>'Box'. }
var
Pos1,Pos2:Palabra;
comenzar
Pos1:=Pos(Antes,Src)+Longitud(Antes);
Pos2:=Pos(Después,Src);
Resultado:=Copiar(Src,Pos1,Pos2-Pos1);
fin;
comenzar
TmpStr:=CenterStr(Body,'update'); {Obtener la información de actualización entre los nombres de los programas}
si TmpStr='' entonces
Resultado:=Falso else {No se puede encontrar la información de actualización de este archivo}
comenzar
Ver:=CenterStr(TmpStr,'<ver>','</ver>');
Update.Version:=SeparateVerStr(Ver); {versión de análisis}
Update.Date:=StrToDate(CenterStr(TmpStr,'<date>','</date>')); { Analizar fecha}
Update.URL:=CenterStr(TmpStr,'<url>','</url>'); {Resolver dirección de actualización}
Resultado:=Verdadero;
fin;
fin;
Donde TUpdate es el formato de grabación de la información que definí:
TSimpleVersion=record{Información de la versión simplificada}
dwPRoductVersionMS: DWORD;{versión principal}
dwProductVersionLS: DWORD;{versión menor}
fin;
TUpdate=registro {información de actualización}
Nombre:Cadena[63];{nombre del programa}
Versión:TSimpleVersion;{versión}
Fecha:TFecha;{fecha}
URL:ShortString;{Dirección de descarga}
fin;
La función SepareVerStr() convierte la información de la versión actualizada en forma de cadena en un formato de información de versión simplificado:
función SepareVerStr(s:String):TSimpleVersion;
constante
Separador='.'; {pensar '.'
var
p,v1,v2,v3,v4:PALABRA;
comenzar
si Longitud(es)=0 entonces Salir;
p:=pos(Separador, s);
v1:=StrToInt(copiar(s,1,p-1));
Eliminar(s,1,p);
p:=Pos(Separador,s);
v2:=StrToInt(copiar(s,1,p-1));
Eliminar(s,1,p);
p:=Pos(Separador,s);
v3:=StrToInt(copiar(s,1,p-1));
Eliminar(s,1,p);
v4:=StrToInt(s);
Resultado.dwProductVersionMS:=v1*$10000+v2;
Resultado.dwProductVersionLS:=v3*$10000+v4;
fin;
Lo último que debe hacer es comparar la información de la versión de los archivos y obtener su propia versión primero. Utilizo la siguiente función:
función GetBuildInfo(FName:string):TSimpleVersion {obtener información de la propia versión}
var
VerInfoTamaño: DWORD;
VerInfo: Puntero;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Ficticio: DWORD;
comenzar
VerInfoSize := GetFileVersionInfoSize(PChar(FName), Dummy);
GetMem(VerInfo, VerInfoTamaño);
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '/', Puntero(VerValue), VerValueSize);
con VerValue^ hacer
comenzar
Result.dwProductVersionMS := dwFileVersionMS; {versión principal}
Result.dwProductVersionLS := dwFileVersionLS; {versión menor}
fin;
FreeMem(VerInfo, VerInfoTamaño);
fin;
Luego use la siguiente función para comparar la versión actualizada del sitio web con la versión actual. Si se devuelve TRUE, significa que hay una nueva versión del archivo:
función VersionCheck(OriVer,NewVer:TSimpleVersion):Boolean;
comenzar
si (OriVer.dwProductVersionMS=NewVer.dwProductVersionMS) entonces
comenzar
Resultado:=OriVer.dwProductVersionLS<NewVer.dwProductVersionLS;
fin de otra manera
comenzar
Resultado:=OriVer.dwProductVersionMS<NewVer.dwProductVersionMS
fin;
fin;