- 註冊時間
 - 2006-3-13 
 - 最後登錄
 - 2025-7-23 
 - 在線時間
 - 675 小時 
 - 閱讀權限
 - 200 
 - 積分
 - 417 
 - 帖子
 - 1109 
 - 精華
 - 0 
 - UID
 - 2 
  
 
 
 
    
 | 
 
用DELPHI製作線上程式升級信息查詢 
 
越来越多的程序支持在线升级功能,本文介绍的就是如何从网站获取升级信息。这里我主要使用版本信息来检测是否需要下载升级版本。 
 
大致原理如下: 
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;
 
  複製代碼 |   
 
  
 |