delphi如何实现程序的自动升级?

defasi 2005-11-03 08:54:03
现有一个用delphi5写的程序,希望能实现在线自动升级,怎么办,大虾们给指点,谢啦
...全文
2382 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgengle 2006-01-10
  • 打赏
  • 举报
回复
不错,mark一下
jackie168 2005-11-05
  • 打赏
  • 举报
回复
实现步骤:

   1、网站提供升级信息。
   2、使用HTTP从网站下载升级信息。
   3、确定是否进行升级
   4、升级程序

  下面我们定义一下升级信息:

   [文件名1]
   datetime=时间
   [文件名2]
   datetime=时间
   存为HTML文件,如定义一个update.htm
   [programe1.exe]
   datetime=2003-07-06
   [programe1.hlp]
   datetime=2003-07-06

  这里只是简单的判断一下文件的时间,如果时间比需要升级的文件时间小的,表示要下载新版本升级它。当然要做到十全十美,这是判断是不合理的,这里只作个简单的介绍。

  写个fuction,判断是否有新的版本要升级

function ExistNewfile&:boolean;
var i,iFileHandle:integer;
FileDateTime:TDateTime;
AppIni:TiniFile;
g_path:string;
url:string;
files:TStrings;
begin
result:=false;
url:=’http://yousoft.hi.com.cn/update.htm/’; //要升级的服务器
g_path:=ExtractFilePath(application.ExeName); //升级程序的路径
if copy(g_path,length(g_path),1)<>’\’ then g_path:=g_path+’\’;
if copy(url,length(url),1)<>’/’ then url:=url+’/’;

//下载升级信息文件
try
HTTPFiles.InputFileMode := true;
HTTPFiles.OutputFileMode := FALSE;
HTTPFiles.ReportLevel := Status_Basic;
HTTPFiles.Body:=g_path+’update/update.ini’; //下载后保存到程序的update目录下
HTTPFiles.Get(url);
except
result:=false; //取得升级信息出错!,不用再继续
exit;
end;
try
files:=TStringlist.Create; //有哪些文件?
AppIni := TIniFile.Create(g_path+’\update\update.ini’);
AppIni.ReadSections(files);
for i:=0 to files.Count-1 do
try
iFileHandle :=FileOpen(g_path+files,fmShareDenyNone);
FileDateTime:=FileDateToDateTime(FileGetDate(iFileHandle)); //取得文件时间
FileClose(iFileHandle);
//是否要下载文件
if FileDateTime,’DATETIME’,’1900-1-1’)) THEN
begin
result:=true;
break;
end;
except
end;
finally
AppIni.free;
files.Free;
end;
end;

  取得files后文件下载!httpfiles为TNMHTTP

HTTPFiles.InputFileMode := true;
HTTPFiles.OutputFileMode := FALSE;
HTTPFiles.ReportLevel := Status_Basic;
HTTPFiles.Body:=g_path+’update/’+files;
HTTPFiles.Get(url);

  把下载后的文件复制到原程序,并备份出一份

for i:=0 to files.Count-1 do //备份文件
begin
//备份一份文件出来
copyfile(pchar(g_path+files),pchar(g_path+files+’.bak’),false);
end;
for i:=0 to files.Count-1 do //从update复制新文件
begin
copyfile(pchar(g_path+’update\’+files),pchar(g_path+files),false);
end;
beyondtkl 2005-11-04
  • 打赏
  • 举报
回复
呵呵 自动更新应该不复杂的呀...

楼上的方法也不错 应该windows就是类似这样更新的吧..

可以做一个nt service...自动检测..呵呵
chinasdp 2005-11-04
  • 打赏
  • 举报
回复
楼上的方法不错,不过我最近用C#开发时采用了另一种升级方法:
DB上建一个表,存相关文件的名称、版本、相对路径;当有个别文件发生改变时把它以流的形式上传到DB,客户端可以读取该表,根据版本信息判断是否下载该文件。
coffee36 2005-11-04
  • 打赏
  • 举报
回复
学习
FigoZhu 2005-11-04
  • 打赏
  • 举报
回复
http://www.nuclear2000.com
jackie168 2005-11-04
  • 打赏
  • 举报
回复
http://www.eastrise.net/company/soft/EaUpdate2.4.rar
阿呆_ 2005-11-04
  • 打赏
  • 举报
回复
用下述方法可以实现程序自我升级更新:

1. 程序启动时循环尝试删除旧版本文件(如果存在,比如同名的.old文件)直到成功才进行其它初始化并运行。

2. 程序中定时监测是否有新版本需要下载,一个简单的方法就是比较新旧版本文件的CRC,如果不同就说明要更新了。如果是远程更新那么可以在远端放置一个服务程序,它的作用就是返回它所监控最新版本文件的CRC,本地程序只要比较它自身的CRC(可以保存在特殊的地方,比如注册表或ini中,也可以临时计算,如果程序小于5M的话这点计算时间可以忽略)和服务端返回的CRC是否相同即可。

3. 当监测到需要更新时可以先将最新版本下载到本地同一磁盘的一个临时文件中(最好也是同目录)

4. 开始自我升级步骤:
1. 用move函数将自身改名成旧版本文件名,比如aaa.exe.old
2. 将下载的临时文件改名成原exe名,比如 aaa.exe
3. 运行这个新文件,由于它在启动时会不断尝试删除 aaa.exe.old而这个aaa.exe.old目前被占用无法删除,所以再次运行的程序对当前程序不会造成影响。
4. 退出当前程序。

that's all.
lovendII 2005-11-03
  • 打赏
  • 举报
回复
用Delphi编制可自动升级程序

以下是例子,设我们已经有一个应用程序This.exe,要对它升级,用来升级的程序为Upgrade.exe.

1.This的工程文件框架

program THIS;

uses

SysUtils,

Windows,

Forms,

...;

我们将它写入代码中,因为这在Delphi的工程文件中是没有自动生成的.“…”部分是你创建的窗体部分

Var

Fn : String;

TSI : TStartupInfo;

TPI : TProcessInformation;

{$R *.RES}

begin

“升级程序”使用FileAge来检查原来应用程序的建立时间,如果检测到的是旧版本,则提示升级:

IF FileAge(‘SomeServerSomeDirthis.exe‘) 〉 FileAge(ParamStr(0)) THEN

IF Application.MessageBox(‘这是一个更新版本的THIS.EXE.‘+#13‘你要得到新版本的升级文件吗?‘, ‘Upgrade Time!‘,1) = 1 THEN

Begin

运行升级程序时,升级程序应与原主程序this.exe在同一目录下.如果当它启动时,这个版本主程序应该退出,但要保证它不会删除任何文件,因为此时Application.Initialize还没有被调用.代码如下:

Fn:= ExtractFilePath(ParamStr(0))+‘UpgradeThis.exe‘;

FillChar(TSI, SizeOf(TSI), 0);

TSI.CB := SizeOf(TSI);

IF CreateProcess (PChar(Fn), NIL, NIL, NIL, False,

DETACHED_PROCESS, NIL, NIL, TSI, TPI)

THEN Exit

但是,如果“升级程序”由于某些原因没有运行,我们此时应该告诉用户,他能通过其他方法得到一个更新的程序版本,这时我们依然退出主程序以便用户升级.如果必要的话,也可以继续装入并运行旧版本.

ELSE

Begin

messagebeep(0);

Application.MessageBox(‘不能完成文件拷贝.‘+‘ ‘ 请手工拷贝!.‘, ‘Copy Error!‘,1);

Exit;

End;

End;

Application.Initialize;

Application.Title := ‘This‘;

Application.HelpFile := ‘This.hlp‘;

{autocreate forms, etc.}

Application.Run;

end.

如果自动升级程序是一个控制台程序,那么一定要保证正确的控制台程序连接选项设置.

program UpgradeThis;

uses

Forms,

SysUtils,

Windows;

Var

Fn : String;

TSI : TStartupInfo;

TPI : TProcessInformation;

{$R *.RES}

begin

用CopyFile来拷贝新版本的文件,同FileAge一样,它不考虑标准命名格式的路径和文件名.

IF CopyFile(‘SomeServerSomeDirthis.exe‘,

PChar(ExtractFilePath(ParamStr(0))+‘this.exe‘),False) THEN

Begin

一旦这些新版本的文件被拷贝到系统中,它就应该能够运行了,而且也没有理由不运行.所以,这里基本上不需要加入出错检测的代码.

那么,例子中使它运行并简单处理错误的代码如下:

Fn := ExtractFilePath(ParamStr(0))+‘this.exe‘;

FillChar(TSI, SizeOf(TSI), 0);

TSI.CB := SizeOf(TSI);

CreateProcess(PChar(Fn), NIL, NIL, NIL, False, DETACHED—PROCESS, NIL, NIL, TSI, TPI);

End

ELSE

Application.MessageBox(‘不能拷贝文件THIS.EXE‘, ‘Error!‘, mb_OK);

end.

需要注意的是,在这些用来升级程序的代码中,并没有用到任何Application.Initialize和Application.Run.这些方法同样可以被引用来作检查新版本的帮助文件(用GetWindowsDir或GetWindowsDirectory并把“Help”加入到用来升级的程序中)或用来检测“升级程序”是否是新的版本.

上面只是从文件的更新角度说明了编制“升级程序”的方法,但在很多情况中升级一个程序甚至要修改注册表或各种INI的文件,这些在Delphi中是比较容易实现的,有兴趣的朋友可以参照一些资料来加入实现这些功能的代码

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧