2002年新年的作品,这个例子是演示如何从网站得到是否有程序的更新版本。 我放了一个文本文件再我的网站,地址是 http://www.2ccc.com/update.txt 这个文本文件有自己的格式,有点像HTML语言的那种格式。 { ; update.txt 文件格式演示 ; 第一个应用程序更新信息 [update] //程序标示符 <ver>1.79.9.25</ver> //最新版本 <url>http://www.2ccc.com/delphi/simple/update_demo.zip<;/url> //下载地址 <date>2002-9-25</date> //更新日期 [/update]
; 另外一个程序的信息 [exelock] <ver>2.11.0.0</ver> <url>http://www.2ccc.com/delphi/general/exelock_demo.zip<;/url> <date>2002-9-25</date> [/exelock]
; 你可以放更多这样的信息 } 在这个演示程序中,我是用了TNMHTTP组件得到文本文件的正文然后以字符串形式分析格式将其中的信息分离,可以得到版本,下载地址,更新日期等信息,你可以自己增加更多,程序作相应的调整就行了。2003年我写了新方法,直接使用InternetReadFile()函数得到升级文件信息,其实原理一样,并且我将它封装到一个单元中方便使用。
03:49 2002-2-14 中国西安 更多请察看 http://www.2ccc.com DELPHI6.0编译通过。
更详细的文档大家可以到 http://www.zdnet.com.cn/developer/code/story/0,2000081534,39045821,00.htm 察看。
文档分析:
使用TNMHTTP组件从网站获取此文件的内容: function TForm1.GetUpdateText:String; begin NMHTTP1.InputFileMode := FALSE; NMHTTP1.OutputFileMode := FALSE; NMHTTP1.ReportLevel := Status_Basic; NMHTTP1.Get('http://www.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.dwProductVersion_MS=NewVer.dwProductVersionMS) then begin Result:=OriVer.dwProductVersionLS<NewVer.dwProductVersionLS; end else begin Result:=OriVer.dwProductVersionMS<NewVer.dwProductVersionMS end; end;
到这里基本方法就介绍完了,我在DELPHI6+WIN2000环境调试通过,这里我没有写出完整的代码,大家可以下载慢慢研究。 |