オンライン アップグレード機能をサポートするプログラムが増えています。この記事では、Web サイトからアップグレード情報を入手する方法を紹介します。ここでは主にバージョン情報を使用して、アップグレードされたバージョンをダウンロードする必要があるかどうかを検出します。
一般原則は次のとおりです。
1. Web サイトに情報テキストを配置します。
2. TNMHTTP を使用して、Web サイト情報テキストからテキスト コンテンツを取得します。
3. テキスト解析に必要な情報を分析します。
4. プログラムのバージョンを比較して、アップグレード情報を提供します。
まず、Web サイトに情報テキストを配置します。このテキストには次の形式を定義しました。
[アップデート]
<ver>1.79.9.25</ver>
<url>http://delphibox.com/softm/3_update.zip</url>
<日付>2002-9-25</日付>
[/アップデート]
これを update.txt ファイルとして保存し、[]<> 識別子を使用して、プログラム名、バージョン、更新日、ダウンロード アドレスなどの情報を分類できます。ここでは http://2ccc.com/update.txt にアップロードするとします。
次に、TNMHTTP コンポーネントを使用して、Web サイトからこのファイルのコンテンツを取得します。
関数 TForm1.GetUpdateText:String;
始める
NMHTTP1.InputFileMode := FALSE;
NMHTTP1.OutputFileMode := FALSE;
NMHTTP1.ReportLevel := Status_Basic;
NMHTTP1.Get('http://2ccc.com/update.txt'); {Web サイトのテキストを取得}
結果:=NMHTTP1.Body;
終わり;
テキストを取得したら、次の関数を使用して情報を分離する必要があります。
function TForm1.AnalyseUpdate(Body:String;var Update:TUpdate):Boolean;
変数
TmpStr、Ver:文字列;
関数 CenterStr(Src:String;Before,After:String):String;
{ この関数は、2 つの文字列の中間の文字列を分離するために使用されます。
たとえば、..('DelphiBox.com','Delphi','.com')=>'Box'。 }
変数
Pos1、Pos2:単語;
始める
Pos1:=Pos(Before,Src)+Length(Before);
Pos2:=Pos(After,Src);
結果:=Copy(Src,Pos1,Pos2-Pos1);
終わり;
始める
TmpStr:=CenterStr(Body,'update'); {プログラム名間のアップグレード情報を取得}
TmpStr='' の場合、
結果:=False else {このファイルのアップグレード情報が見つかりません}
始める
Ver:=CenterStr(TmpStr,'<ver>','</ver>');
Update.Version:=SeparateVerStr(Ver) {解析バージョン};
Update.Date:=StrToDate(CenterStr(TmpStr,'<date>','</date>')) {日付を解析}
Update.URL:=CenterStr(TmpStr,'<url>','</url>'); {アップグレード アドレスを解決}
結果:=真;
終わり;
終わり;
ここで、TUpdate は私が定義した情報の記録形式です。
TSimpleVersion=record{簡易バージョン情報}
dwPROductVersionMS: DWORD;{メジャー バージョン}
dwProductVersionLS: DWORD;{マイナー バージョン}
終わり;
TUpdate=レコード {アップグレード情報}
名前:String[63];{プログラム名}
バージョン:TSimpleVersion;{バージョン}
日付:TDate;{日付}
URL:ShortString;{ダウンロードアドレス}
終わり;
SeparateVerStr() 関数は、文字列形式のアップグレードされたバージョン情報を簡略化されたバージョン情報形式に変換します。
関数 SeparateVerStr(s:String):TSimpleVersion;
定数
区切り文字='.'; {区切り文字を考えてください}
変数
p、v1、v2、v3、v4:単語;
始める
長さ=0の場合は終了します。
p:=pos(区切り文字, s);
v1:=StrToInt(copy(s,1,p-1));
削除(s,1,p);
p:=Pos(区切り文字,s);
v2:=StrToInt(copy(s,1,p-1));
削除(s,1,p);
p:=Pos(区切り文字,s);
v3:=StrToInt(copy(s,1,p-1));
削除(s,1,p);
v4:=StrToInt(s);
Result.dwProductVersionMS:=v1*$10000+v2;
Result.dwProductVersionLS:=v3*$10000+v4;
終わり;
最後に、ファイルのバージョン情報を比較して、自分のバージョンを取得するために、次の関数を使用します。
function GetBuildInfo(FName:string):TSimpleVersion; {独自のバージョン情報を取得}
変数
VerInfoSize: DWORD;
VerInfo: ポインタ。
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
ダミー: DWORD;
始める
VerInfoSize := GetFileVersionInfoSize(PChar(FName), ダミー);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '/', Pointer(VerValue), VerValueSize);
VerValue^ を使用して実行します
始める
Result.dwProductVersionMS := dwFileVersionMS;
Result.dwProductVersionLS := dwFileVersionLS;
終わり;
FreeMem(VerInfo, VerInfoSize);
終わり;
次に、次の関数を使用して、Web サイトのアップグレードされたバージョンと現在のバージョンを比較します。TRUE が返された場合は、ファイルの新しいバージョンがあることを意味します。
関数 VersionCheck(OriVer,NewVer:TSimpleVersion):Boolean;
始める
if (OriVer.dwProductVersionMS=NewVer.dwProductVersionMS) then
始める
結果:=OriVer.dwProductVersionLS<NewVer.dwProductVersionLS;
それ以外で終了
始める
結果:=OriVer.dwProductVersionMS<NewVer.dwProductVersionMS
終わり;
終わり;