越來越多的程序支持在線升級功能,本文介紹的就是如何從網站獲取升級信息。這里我主要使用版本信息來檢測是否需要下載升級版本。 大致原理如下: 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環境調試通過,這里我沒有寫出完整的代碼,在我的主頁我做了演示程序,大家可以下載慢慢研究。 我的網址是:http://DelphiBox.com 或 http://2ccc.com 如果有問題可以給我來信交流:mantousoft@vip.163.com
重慶 萬重 西安科技學院143信箱 710054
|