程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用DELPHI制作在線程序升級信息查詢

用DELPHI制作在線程序升級信息查詢

編輯: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;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved