把新程序打包放到你的服务器上,外加一个配置说明文件(ini或xml)。你的程序跑起来的时候,启动一个慢线程,下载你的配置说明文件(ini或xml),与本地的进行对照,如果一致就直接退出,如果有更新就接着下载到一个临时目录。这都是小意思了,重点是怎么覆盖原来的相应文件,因为系统跑起来的时候,文件是不能被删除和覆盖的。
我的做法有四种
一是如果只是某EXE或DLL有变化,那么先把本地的改名,然后直接拷贝覆盖就可以了(当然你得想办法删除改名后的文件)。我现在做的浏览器是用这个方法的,不过还有改进的空间,现在是只图简单。
二是额外写一个DLL文件,我取名为AutoCopy.dll,这个模块其实只是拷贝文件而已。在我的工作系统退出的时候,通过rundll32.exe来调用我的AutoCopy.dll(再附加一些参数),然后自己的系统退出。AutoCopy.dll被rundll32.exe加载之后,一直等待到工作系统退出,然后再从附加的参数中解析出需要拷贝的文件进行拷贝操作。而还可以做得更好一些,就是AutoCopy.dll做为工作系统的资源,需要的时候再动态写到文件中执行,完了之后可以自删除(比EXE文件简单许多)。这个方法以前做大型系统的时候使用过。
三是用一个没有什么具体功能的EXE(暂称为shell.exe)来调用真正有意义的功能模块,shell.exe负责判断工作系统的版本并下载相关的组件,在适当的时候关闭并覆盖工作系统。由于shell.exe很功能很单一,几乎不需要再升级了。当然也可以做得更好,就是工作系统在适应的时候更新shell.exe,呵呵。这个方案眼前正在使用。
第四方案与三差不多,不过功能模块不是普通的EXE或DLL,而是脚本,这就象是浏览器执行JS脚本一样了。不过这个脚本是行业相关的,功能可以更加强大,这升级当然就更容易了。眼前我正在试图拓展脚本,希望能方便地应用于普通的小程序。呵呵
Q:升级会涉及到注册表的变化等等,并非单纯的拷贝升级。
对于,shell.exe,其启动的时机是什么呢?如何自启动呢?
A:“升级会涉及到注册表的变化等等,并非单纯的拷贝升级。 ”如果升级会因为注册表的问题而造成困惑,那么一定设计上是非常不合理的了,你得多考虑一下设计上的问题。升级考虑更多的应该三方面,一是各模块的版本信息判断问题,二是各模块的下载问题,三就是覆盖问题。而这三方面,最后的一个问题最重要了,因为有可能因为种种原因而只能成功覆盖部份模块,这可能就得有版本回滚或其它的补救方案。具体应用中怎么处理,就看项目的性质和公司的习惯了。
“对于,shell.exe,其启动的时机是什么呢?如何自启动呢?”,我已说得很明白了,这个shell.exe其实就是一个入口,当然就是最初的时候运行了。这个程序就是先判断是不是要更新真正的应用系统(如果要就先更新),然后再启动真正的业务应用系统。
Q:多谢bluebee2009回复,现在有个问题:你在回复中提到“额外写一个AutoCopy.DLL文件,在工作系统退出的时候,通过rundll32.exe来调用我的AutoCopy.dll”,这个“在工作系统退出的时候,通过rundll32.exe来调用我的AutoCopy.dll”如何实现的?我vc不是太好,多谢指教!
A:你查一下rundll32.exe相关的资料就知道了。
http://topic.csdn.net/u/20090219/15/1586d6b3-7038-4052-aba3-c150398a019c.html?1116549494