谁研究过程序的在线升级呢?欢迎大家来讨论一下 怎么得到网上最新版本的情况,并且进行下载呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是一个exe的化,应该用另一个例如update.exe来启动,它先检查版本,根据结果来进行下载或者执行你本身的程序做成联众那种dll的形式还是比较好的,这样不用一次下载那么大的文件 Easy啦!客户端多一个网络通信的代码,每隔一段时间就连结网络到你的站点指定位置检查一下最新版本,如果比现在的新,那么就下载比现在新的东西就OK 你可以使用ftp组件来取得某个文件的日期啊, 恩,好主意呀。嘿嘿,那么怎么下载程序呀,用Delphi写一个吗? 给你一个程序,是我昨天写的,给我email,要给分的 利用流对象来处理比较灵活呵呵,可以将程序保存在数据库里面,然后根据版本号返回不同的版本程序。 有点 webcvs 的概念啦。 我得Email是[email protected]谢谢啦 DelphiBoy2003给个例子可以吗? [email protected]THS LOT@@ 是的,一般用dll比较好,写成插件 你给我的程序少一个Dll文件,编译的时候少一个控件呀! xqhchun(梦龙) 我想先看看程序运行的效果 1、在服务器端放一个ini文件,里面记录最新的版本号和以前版本对应的要升级文件2、检测的时候把该ini文件下载到本地,3、读取最新版本号与现在版本进行对比,然后决定是不是需要升级,需要升级那些文件 http://www.fulgan.com/delphi/autoupdate_unit_for_delphi.htm 本地需要保存有现有程序的版本信息,在线升级时到升级服务器上通过http或ftp下载最新版本信息文件,此文件可以是普通文本文件或者ini文件,下载到本地后获取最新的版本信息。如果最新版本信息大于现有版本信息,则使用http或者ftp协议下载最新的文件。下载后更新即可。更新时可能还需要考虑你是更新dll的方式还是更新主程序的方式。不论采用哪种方式,估计主程序还是需要先关闭,这样你才能更新那些需要更新的文件。 补充一点: 如果不操作数据库的应用软件可能很少了,所以升级时除了FTP获取最新的DLL模板,获取并执行SQL升级语句也是重要的一步。 ari的性欲居然到298了,汗一个。。服务器保存一个版本号。本地有一个,或者放在INI里,或者放在注册表里。和服务器通讯。得到服务器版本号。如果低于,就发请求,要求更新。服务器根据本地版本号。得到需要更新的文件。然后。 大致原理如下: 1、放置信息文本到网站。 2、使用TNMHTTP从网站信息文本获取文本内容。 3、分析文本解析所需信息。 4、比较程序版本提供升级信息。 首先,我们放置一个信息文本到自己的网站,这个文本有自己的文件格式,定义如下的格式:[update] <ver>1.79.9.25</ver> <url>http://www.xxxxxxxxxx.com/soft/1.79.9.25_update.zip</url> <date>2002-9-25</date> [/update]我们可以将它保存为update.txt文件,使用[]<>的标示符将信息分类,这里包含了程序名、版本、更新日期和下载地址。这里我假使上传到http://www.yyyyyyy.com/update.txt。 然后我们使用TNMHTTP组件从网站获取此文件的内容: function TForm1.GetUpdateText:String; begin NMHTTP1.InputFileMode := FALSE; NMHTTP1.OutputFileMode := FALSE; NMHTTP1.ReportLevel := Status_Basic; NMHTTP1.Get('http://www.yyyyyyy.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; { 这个函数用来分离两个字符串中间的字符串, 例如 ..('xxxxxxxxxx.com','xxxxxx','.com')=>'xxxx'。 } 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; 非常感谢wg007(迈克),写这么条理,这么清楚!感谢aiirii(ari-爱的眼睛),除了性欲高之外,提供的这个链接也不错!感谢楼主! 我的做法是:开辟一个ftp服务器,在服务器上放一个配置文件,配置文件有版本信息,和需要更新的文件列表用一个update.exe,启动时连接ftp服务器,下载配置文件,检查版本是否一致,不一致,则下载相应程序,则ok!电信软件都是用的这种模式!比较稳定 Update.exe与主程序一起运行?如果是下载主程序文件以后,然后怎样对主程序文件进行替换? 哈哈,我来说两句吧第一:wg007(迈克)的发的贴不是写的,而是copy的,在这里更正。第二:aiirii(ari-爱的眼睛),性欲比较高,比较强这是CSND里的网友都知道的,所以不要在这里表扬了哈哈,发言完毕 这里有一个例子源码.你可下载看看.http://www.delphibox.com/article.asp?articleid=1037 另外,给一个文档大家看吧http://dev.csdn.net/develop/article/19/19470.shtm也是在线升级的,希望每个人都在进步~! www.2ccc.com 上面有很多源码 启动一个升级程序,获取版本及文件信息,再通过Tidhttp/Tidftp控件下载文件。盒子上也有例程。 还有个问题,下载后怎样替换掉正在运行的旧版EXE???? FindWindowEx找到的按钮句柄怎么转换为TButton? 各位大侠来帮帮我吧 在用DElPHI开发程序时,如数据库应用,会有很多的穸体和很大的代码,但都集中在一个可执行文件中了,有没有办法将代码 动态加载DLL时出现如下错误 如何设置多窗体启动? 和女朋友吵架了,用什么方法哄她才会开心~ 一个简单的问题... 视视会议,视频语音控件,多人视频聊天室,即时通(类似qq)等源码 C++代码翻译 关于 TreeView 的问题 如何获取U盘的硬件信息 在Tqrlabel控件在做好的程序中是无法移动的,如何才能使之移动?
呵呵,可以将程序保存在数据库里面,然后根据版本号返回不同的版本程序。 有点 webcvs 的概念啦。
THS LOT@@
2、检测的时候把该ini文件下载到本地,
3、读取最新版本号与现在版本进行对比,然后决定是不是需要升级,需要升级那些文件
更新时可能还需要考虑你是更新dll的方式还是更新主程序的方式。不论采用哪种方式,估计主程序还是需要先关闭,这样你才能更新那些需要更新的文件。
如果不操作数据库的应用软件可能很少了,所以升级时除了FTP获取最新的DLL模板,获取并执行SQL升级语句也是重要的一步。
1、放置信息文本到网站。
2、使用TNMHTTP从网站信息文本获取文本内容。
3、分析文本解析所需信息。
4、比较程序版本提供升级信息。
首先,我们放置一个信息文本到自己的网站,这个文本有自己的文件格式,定义如下的格式:
[update]
<ver>1.79.9.25</ver>
<url>http://www.xxxxxxxxxx.com/soft/1.79.9.25_update.zip</url>
<date>2002-9-25</date>
[/update]
我们可以将它保存为update.txt文件,使用[]<>的标示符将信息分类,这里包含了程序名、版本、更新日期和下载地址。这里我假使上传到http://www.yyyyyyy.com/update.txt。
然后我们使用TNMHTTP组件从网站获取此文件的内容:
function TForm1.GetUpdateText:String;
begin
NMHTTP1.InputFileMode := FALSE;
NMHTTP1.OutputFileMode := FALSE;
NMHTTP1.ReportLevel := Status_Basic;
NMHTTP1.Get('http://www.yyyyyyy.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;
{ 这个函数用来分离两个字符串中间的字符串,
例如 ..('xxxxxxxxxx.com','xxxxxx','.com')=>'xxxx'。 }
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;
感谢aiirii(ari-爱的眼睛),除了性欲高之外,提供的这个链接也不错!
感谢楼主!
开辟一个ftp服务器,在服务器上放一个配置文件,配置文件有版本信息,和需要更新的文件列表
用一个update.exe,启动时连接ftp服务器,下载配置文件,检查版本是否一致,不一致,则下载相应程序,则ok!
电信软件都是用的这种模式!比较稳定
第一:wg007(迈克)的发的贴不是写的,而是copy的,在这里更正。
第二:aiirii(ari-爱的眼睛),性欲比较高,比较强这是CSND里的网友都知道的,所以不要在这里表扬了
哈哈,发言完毕
http://dev.csdn.net/develop/article/19/19470.shtm
也是在线升级的,希望每个人都在进步~!
盒子上也有例程。