有远程升级功能,并且制作方便。
公布了一自动更新的控件,摘一点相关内容大家共赏。
理论篇
软件的自动升级功能是一个非常实用的技术。对于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;
方法
下载升级包,并且执行升级。