利用Tiger Installer实现自动升级功能
软件的自动升级功能是一个非常实用的技术。对于C/S系统每次系统修改都要逐一升级客户端,这是一个繁琐的让人痛恨的工作,也是C/S系统经常被人抨击的一个痛处。即便是三层系统,在系统修改的时候也免不了要更新客户端。对于其他的单机软件,在现在互联网普及的环境下给软件增加一个通过互联网自动升级的功能也能给用户带来便利,同时提升软件的档次。
要实现自动升级的功能在技术上有什么要求呢?
第一,需要制作升级包。这个升级包还需要功能全面,简单的系统一般是直接更新一个客户端程序就可以了,但是实际复杂一点的系统都可能包含多个文件、注册表、ActiveX组件、COM/COM+组件、BDE/ODBC别名、升级的时候还可能要执行一些程序。这是自动升级功能中最复杂的部分,但是现在Tiger Installer已经支持生成功能完备的升级包了,而且这些升级具有可以和原来的安装融合在一起的功能,也就是说无论装了多少个/次升级包,卸载的时候都可以一次过卸载所有的对象,不需要对升级包进行逐一卸载。具体操作请参阅Tiger Installer的帮助文件。
第二,需要从服务器获得最新的版本,下载升级包。这个有很多的实现方案,可以通过服务器的共享文件夹、FTP服务器、WEB服务器、或者自己写的服务器。我认为实用WEB服务器是最佳选择,管理方便,功能强大,我们可以通过脚本实现比如预定时间发布升级包、根据客户端的版本发布不同的升级包等功能,在后面的例子将会用简单的ASP脚本实现上面的功能。
第三,更新主程序的问题。在自动升级的时候一般都是在主程序里获得最新版本并启动升级包进行升级。这样会带来一个问题,就是如何避免由于主程序在运行的时候不能更新造成的升级失败。在这里我使用了一个简单的办法,在启动升级包的时候把主程序的进程ID传给升级包,这样升级包就可以根据这个进程ID获得主程序的进程句柄,使用WaitforsingleObject函数等待主程序退出再执行升级操作,这样就不会有无法更新主程序的问题了。
根据上面的技术分析,第一点已经由Tiger Installer实现了,第三点中升级包中根据进程ID等待主程序退出也已经在Tiger Installer中实现了,其他的部分我写了一个Delphi简单的控件来实现。下面是控件的属性和方法。
|
属性/方法 |
类型 |
|
|
Version : String; |
属性 |
软件的当前版本。 |
|
VersionURL : String; |
属性 |
取得最新版本的URL。 |
|
DownloadURL : String; |
属性 |
下载升级包的URL。 |
|
LatestVersion : String; |
属性 |
获取最新版本。 |
|
Download : Boolean; |
方法 |
下载升级包,并且执行升级。 |
从下面的地址下载Tiger Update控件包里面包含控件和一个范例程序,两者都包括源代码。http://www.wisdomcube.com/stuff/tigerupdate.rar
1. 用Delphi打开TigerUpdate60.dpk或TigerUpdate70.dpk(分别在Delphi6和Delphi7目录下),编译安装,如下图,先点击Compile再点击Install。

2. 点击Delphi的菜单"Tools->Environment Options.."进入Environment Options..对话框,在Library页面中把Tiger Update控件所在的目录加入到Library Path中,如下图

3. 安装完毕。
打开TigerUpdate\Sample目录下的UpdateTest.dpr文件,编译出可执行文件UpdateTest.exe。
1. 打开TigerInstaller,在左边对象树状图中右击我的应用软件节点,在弹出菜单上点击属性,如下图
把产品名称改成“自动升级测试程序”如下图

2. 在应用程序文件夹(即安装目录)的右击弹出菜单中点击添加->文件如下图

在弹出的打开文件对话框中选择刚才编译出来的UpdateTest.exe文件。
3. 右击UpdateTest.exe文件,在弹出菜单上点击“创建快捷方式”,如下图:

4. 把创建出来的快捷方式拖放到“用户的桌面”文件夹中,这样在安装完以后会在桌面上创建快捷方式方便测试程序。
5. 点击保存按钮保存这个项目为Sample.tpr
6. 点击生成,生成原始安装程序。
打开TigerUpdate\Sample目录下的UpdateTest.dpr文件,修改TigerUpdate1组件的属性Version为1.01,保存项目,然后重新编译出可执行文件UpdateTest.exe。
1. 打开刚才保存的Sample.tpr文件。
2. 点击菜单上的“新建->本项目升级包”创建Sample.tpr的升级包项目,如下图:

3. 在左边对象树状图中右击我的应用软件节点,在弹出菜单上点击属性,在项目属性对话框中把版本改成1.01
4. 同样把UpdateTest.exe文件加入到“应用程序文件夹”中
5. 为了区分原安装程序和升级包,点击菜单“编译->生成选项”,在生成选项对话框中把输出文件夹改成“自动升级测试程序\Update”,如下图:

6. 点击“保存”按钮,把项目保存为SampleUpdate.tpr
7. 点击生成按钮生成升级包。
假设您的电脑上已经安装并且设置好了IIS。把TigerUpdate\Sample目录下的Update.asp文件复制到web站点的主目录下,然后把升级包重命名为Update.exe同样复制到web站点的主目录下。
运行原始安装程序,安装完毕后,在桌面会创建一个UpdateTest的快捷方式,双击打开UpdateTest.exe,注意这时候Caption显示的是1.00,点击“检查版本”按钮,会显示“最新版本:1.01”,点击升级会出现下载进度窗口,下载完以后程序退出,升级包的安装程序启动,升级包安装好以后,双击桌面上的UpdateTest快捷方式,打开UpdateTest.exe程序,您会发现现在的版本已经是1.01了。
在需要强制更新软件的情况下(比如某些C/S系统,为了保证数据安全,所有客户端的版本必须是最新的),可以在UpdateTest的主程序的Dpr文件加上下面的代码:(原来已经有了,把注释去掉即可)
//以下的代码适合需要强制升级的情况
with TTigerUpdate.Create(nil) do
begin
try
VersionURL := 'http://127.0.0.1/Update.asp?Command=Version';
DownloadURL := 'http://127.0.0.1/Update.asp?Command=Download&Version=<VERSION>';
Version := '1.01';
if (LatestVersion > Version) and Download then
Exit;
finally
Free;
end;
end;
////////////////////////////////////////
这样每次主程序运行都会检查并更新程序
有是时间有限,上面的介绍写得比较简陋,有什么问题可以到我的主页给我留言。
主页地址::http://www.wisdomcube.com/
TigerUpdate控件源代码下载地址:http://www.wisdomcube.com/stuff/tigerupdatesrc.rar