用DELPHI制作在线程序升级信息查询

    技术2022-05-11  122

        越来越多的程序支持在线升级功能,本文介绍的就是如何从网站获取升级信息。这里我主要使用版本信息来检测是否需要下载升级版本。 大致原理如下:   1、放置信息文本到网站。   2、使用TNMHTTP从网站信息文本获取文本内容。   3、分析文本解析所需信息。   4、比较程序版本提供升级信息。     首先,我们放置一个信息文本到自己的网站,这个文本有自己的文件格式,我定义了如下的格式:   [update]     <ver>1.79.9.25</ver>     <url>http://delphibox.com/softm/3_update.zip</url>     <date>2002-9-25</date>   [/update] 我们可以将它保存为update.txt文件,使用[]<>的标示符将信息分类,这里包含了程序名、版本、更新日期和下载地址。这里我假使上传到http://2ccc.com/update.txt。     然后我们使用TNMHTTP组件从网站获取此文件的内容: function TForm1.GetUpdateText:String; begin   NMHTTP1.InputFileMode := FALSE;   NMHTTP1.OutputFileMode := FALSE;   NMHTTP1.ReportLevel := Status_Basic;   NMHTTP1.Get('http://2ccc.com/update.txt'); { 获取网站文本 }   Result:=NMHTTP1.Body; end;     获取文本以后,我们要将其中的信息分离,我使用了如下的函数: function TForm1.AnalyseUpdate(Body:String;var Update:TUpdate):Boolean; var   TmpStr,Ver:String;   function CenterStr(Src:String;Before,After:String):String;   { 这个函数用来分离两个字符串中间的字符串,     例如 ..('DelphiBox.com','Delphi','.com')=>'Box'。 }   var     Pos1,Pos2:WORD;   begin     Pos1:=Pos(Before,Src)+Length(Before);     Pos2:=Pos(After,Src);     Result:=Copy(Src,Pos1,Pos2-Pos1);   end; begin   TmpStr:=CenterStr(Body,'update'); { 得到程序名间的升级信息 }   if TmpStr='' then     Result:=False else { 找不到此文件升级信息 }   begin     Ver:=CenterStr(TmpStr,'<ver>','</ver>');     Update.Version:=SeparateVerStr(Ver); { 解析版本 }     Update.Date:=StrToDate(CenterStr(TmpStr,'<date>','</date>')); { 解析日期 }     Update.URL:=CenterStr(TmpStr,'<url>','</url>'); { 解析升级地址 }     Result:=True;   end; end; 其中TUpdate是我定义的信息的记录格式:   TSimpleVersion=record  { 简化的版本信息 }     dwProductVersionMS: DWORD; { 主版本 }     dwProductVersionLS: DWORD; { 辅版本 }   end;   TUpdate=record       { 升级信息 }     Name:String[63];  { 程序名 }     Version:TSimpleVersion; { 版本 }     Date:TDate;  { 日期 }     URL:ShortString;  { 下载地址 }   end; 而SeparateVerStr()函数是将得到字符串形式的升级版本信息转换为简化的版本信息格式: function SeparateVerStr(s:String):TSimpleVersion; const   Separator='.'; { 以为'.'分割符 } var   p,v1,v2,v3,v4:WORD; begin   if Length(s)=0 then Exit;   p:=pos(Separator, s);   v1:=StrToInt(copy(s,1,p-1));   Delete(s,1,p);   p:=Pos(Separator,s);   v2:=StrToInt(copy(s,1,p-1));   Delete(s,1,p);   p:=Pos(Separator,s);   v3:=StrToInt(copy(s,1,p-1));   Delete(s,1,p);   v4:=StrToInt(s);   Result.dwProductVersionMS:=v1*$10000+v2;   Result.dwProductVersionLS:=v3*$10000+v4; end;     最后要做的就是比较文件的版本信息,先得到自己的版本,我使用如下的函数: function GetBuildInfo(FName:string):TSimpleVersion; { 得到自身版本信息 } var   VerInfoSize: DWORD;   VerInfo: Pointer;   VerValueSize: DWORD;   VerValue: PVSFixedFileInfo;   Dummy: DWORD; begin   VerInfoSize := GetFileVersionInfoSize(PChar(FName), Dummy);   GetMem(VerInfo, VerInfoSize);   GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);   VerQueryValue(VerInfo, '/', Pointer(VerValue), VerValueSize);   with VerValue^ do   begin     Result.dwProductVersionMS := dwFileVersionMS; { 主版本 }     Result.dwProductVersionLS := dwFileVersionLS; { 辅版本 }   end;   FreeMem(VerInfo, VerInfoSize); end; 然后使用如下的函数比较网站的升级版本和现在的版本,如果返回TRUE,说明有新版本文件: function VersionCheck(OriVer,NewVer:TSimpleVersion):Boolean; begin   if (OriVer.dwProductVersionMS=NewVer.dwProductVersionMS) then   begin     Result:=OriVer.dwProductVersionLS<NewVer.dwProductVersionLS;   end else   begin     Result:=OriVer.dwProductVersionMS<NewVer.dwProductVersionMS   end; end;     到这里基本方法就介绍完了,我在DELPHI+WIN2000环境调试通过。     2002年


    最新回复(0)