Chinaunix首页 | 论坛 | 博客
  • 博客访问: 500453
  • 博文数量: 225
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2443
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-05 22:02
个人简介

目前在一家公司担任软件总监,主要涉及智能手机,笔记本电脑的开发

文章分类

全部博文(225)

文章存档

2024年(6)

2023年(68)

2022年(13)

2021年(7)

2020年(11)

2019年(3)

2018年(10)

2017年(8)

2012年(7)

2011年(4)

2010年(32)

2009年(41)

2008年(6)

2007年(9)

分类: WINDOWS

2007-11-17 17:23:39

 曾经有多少次心惊胆跳的时候,当产品提交给客户或者产品已经掩膜了,却发现软件中有严重的bug,这些bug也许会导致退货,赔偿,投诉...
  后来我们做windows程序的时候,就想到一个方法,在线升级.大概思路如下:
  首先必须有一个服务器,上面存放{BANNED}最佳新的版本.然后在我们发布的程序包中,除了主程序及其文件外,我们还需要一个单独的在线更新的程序.在线升级程序Update.exe利用一个配置文件config.ini,该配置文件里保存有整个package的版本信息,各个文件的版本信息,以及服务器的URL .文件格式如下:
[Version]
 Version = 2.1.0
[Files]
 A.exe = 2.1.0
 B.txt = 1.5.9
 C.mdb = 1.5.9
 Update.exe =2.0.0
[URL]
 URL =
上面的信息表明当前的版本是2.1.0, 各个文件的版本A.exe 为2.0.0,Update.exe为2.1.0,在服务器上也保存有这样一个config.ini,Update.exe运行时先从服务器URL上把config.ini拉下来,比较Version,如果发现服务器的版本比较新,则比较各个文件,比如在服务器上的版本为2.2.1,其config.ini为
[Version]
 Version = 2.2.1
[Files]
 A.exe = 2.2.1
 B.txt = 1.5.9
 C.mdb = 1.7.9
 Update.exe =2.0.0
[URL]
 URL =
我们发现A.exe 以及C.mdb有更新,将他们下载下来,保存到一个临时目录下.然后查看主程序等是否在运行,在运行的话,把他们的进程Kill掉,把临时目录里的文件copy覆盖就完事了.
  其他的程序文件都好办,不过如果Update.exe本身有bug需要更新,怎么办呢?自己必须把新的Update.exe下载下来,然后覆盖自己,可是当一个进程自己正在运行的时候,文件是不可以被删除,覆盖的.
  我想了一种方法,分为三步:
{BANNED}中国第一步,当Update.exe发现服务器上有更新的Update.exe时,则把新的Update.exe下载下来,然后把自己copy到临时文件目录,启动副本进程,自己退出;
第二步,在副本进程中,把新的Update.exe覆盖旧的Update.exe,然后启动新的Update.exe,自己退出;
第三步,在新的Update.exe进程里,删除刚才所产生的临时文件,并提示用户更新成功.
在每一步启动进程时,传递不同的命令行参数,根据命令行参数的数目来判断所处的阶段,命令行参数中,包含了路径等信息,这样可以知道新的Update.exe,就的Update.exe在哪里.
一切似乎都搞定了,不过既然是windows 应用程序,就会有windows程序的一些特征,首先是注册表,如果版本A和版本B在注册表中所写的信息不一样,怎么办?怎么更新呢?
 我想了一个笨方法,可以用InstallShield来制作Patch,把Patch 也放在服务器上,然后下载下来,用silent 方式运行.
 由于Installshield的Patch是基于某个版本所做的,举个例子吧,现在有4个版本1.1,1.2,1.3,1.4. {BANNED}最佳新的版本为1.4,可是用户的版本可能是1.1,也可能是1.2,也可能是1.3 , 所以你在制作Patch的时候,也许需要制作3个Patch了, 在config.ini中如下:
[Patch]
1.1 = Patch1411.exe
1.2 = Patch1412.exe
1.3 = Patch1413.exe
如果在1.1 和1.2 版本间注册表没变化,则Patch1412.exe不需要,config.ini为
[Patch]
1.1 = Patch1411.exe
1.2 = Patch1411.exe
1.3 = Patch1413.exe
Update.exe根据自己当前的版本,比如目前是1.3,则把Patch1413.exe 下载下来,用silent 方式运行(为什么要用silent 方式运行?因为如果不用silent方式,则用户也许取消掉补丁,这样导致主程序等文件更新到1.4版本了,而注册表还是1.3版本的,更新不完全).
 {BANNED}最佳后补充一点,好象Patch必须要的,因为即使程序所用的注册表信息没有变化,可是我发现当把程序由1.0.0升级到1.2.5的时候,控制面板里仍然显示的是1.0.0,关于这点,我还在想办法,如果那位老兄知道的,不妨给点建议,在此多谢了!
 
阅读(995) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~