分享
 
 
 

用DELPHI制作在线程序升级信息查询

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

越来越多的程序支持在线升级功能,本文介绍的就是如何从网站获取升级信息。这里我主要使用版本信息来检测是否需要下载升级版本。

大致原理如下:

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.comhttp://2ccc.com

如果有问题可以给我来信交流:mantousoft@vip.163.com

重庆 万重

西安科技学院143信箱 710054

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有