MFC - VC做的程序如何做到自动升级?

原文地址:http://my.oschina.net/ypimgt/blog/183988

这个非常简单,把新程序打包放到你的服务器上,外加一个配置说明文件(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相关的资料就知道了。
时间: 2024-11-07 22:24:29

MFC - VC做的程序如何做到自动升级?的相关文章

VFP开发的C/S模式的程序如何实现自动升级功能

最近用VFP开发了一个C/S模式的信息管理系统,由于公司有自己的VPN网路,系统的用户遍布国内外,所以急需要开发一个实现自动升级功能,这样我就可以随时发布信息的补丁包和新开发的功能了. 具体代码要结合程序. 一般这样: 程序A.EXE 和 程序B.EXE (为直正的程序) 1.由 程序A.EXE 连接数据库 2.由 程序A.EXE 取得数据库中 程序B.EXE 的版本(这个版本是在将最新的 程序B.EXE 写入数据库时一同写入的) 3.由 程序A.EXE 取得 程序B.EXE 的版本,如果本地

MFC VC++获取当前程序的运行路径

char szDir[512]; GetModuleFileName(0, szDir, 513); int i; i = lstrlen(szDir) - 1; while(i > 0) { if(szDir[i] == _T('\\')) { szDir[i] = 0; break; } i--; } sprintf_s(szDir, _T("%s\\****.ini"), szDir); 这个方法可以获取到 当前程序的运行的路径,通过while循环,将程序所在的文件夹路径提

C#Winform程序如何发布并自动升级(图解)

有不少朋友问到C#Winform程序怎么样配置升级,怎么样打包,怎么样发布的,在这里我解释一下打包和发布 关于打包的大家可以看我的文章C# winform程序怎么打包成安装项目(图解) 其实打包是打包,发布是发布两者是没有任何关系的,只是有些同志会分不清楚.混在一起了. 下在面大家就和我一起来做一个发布并升级的程序吧. 首先我们准备几个工作 1.新建一个存储发布后程序的目录比如D:\iis\textWinform  以下简称-- 发布目录 2.在IIS新建一个网站并指向目录D:\iis\auto

黄聪:C#Winform程序如何发布并自动升级(图解)

有不少朋友问到C#Winform程序怎么样配置升级,怎么样打包,怎么样发布的,在这里我解释一下打包和发布关于打包的大家可以看我的文章C# winform程序怎么打包成安装项目(图解)其实打包是打包,发布是发布两者是没有任何关系的,只是有些同志会分不清楚.混在一起了.下在面大家就和我一起来做一个发布并升级的程序吧.首先我们准备几个工作1.新建一个存储发布后程序的目录比如D:\iis\textWinform  以下简称-- 发布目录2.在IIS新建一个网站并指向目录D:\iis\autoWinfro

C# Winform程序如何使用ClickOnce发布并自动升级(图解)

有不少朋友问到C#Winform程序怎么样配置升级,怎么样打包,怎么样发布的,在这里我解释一下打包和发布关于打包的大家可以看我的文章C# winform程序怎么打包成安装项目(图解)其实打包是打包,发布是发布两者是没有任何关系的,只是有些同志会分不清楚.混在一起了.下在面大家就和我一起来做一个发布并升级的程序吧. 首先我们准备几个工作1.新建一个存储发布后程序的目录比如D:\IIS\textWinform  以下简称-- 发布目录2.在IIS新建一个网站并指向目录D:\IIS\autoWinfr

C#实现自动升级(附源码)

对于PC桌面应用程序而言,自动升级功能往往是必不可少的.而自动升级可以作为一个独立的C/S系统来开发,这样,就可以在不同的桌面应用中进行复用.本文将着重介绍OAUS的相关背景.使用方法,至于详细的实现细节,大家可以直接下载源码研究.如果了解了OAUS的使用,源码的理解就非常容易了.如果需要直接部署使用自动升级系统,那么,可下载文末的可执行程序压缩包. 一.OAUS的主要功能 目前主流的程序自动升级策略是,重新下载最新的安装包,然后重新安装整个客户端.这种方式虽然简单直观,但是缺陷也很明显.比如,

自动升级系统的设计与实现(源码)

对于PC桌面应用程序而言,自动升级功能往往是必不可少的.而自动升级可以作为一个独立的C/S系统来开发,这样,就可以在不同的桌面应用中进行复用.基于ESFramework的文件传送功能,我实现了一个可直接复用的自动升级系统OAUS,现在将其分享给大家.这篇文章将着重介绍OAUS的相关背景.使用方法,至于详细的实现细节,大家可以直接下载源码研究.如果了解了OAUS的使用,源码的理解就非常容易了.如果需要直接部署使用自动升级系统,那么,可下载文末的可执行程序压缩包. 一.OAUS的主要功能 目前主流的

玩转VC++系统托盘程序(WIN8)

 WINDOWS系统托盘是一个特殊区域,通常在桌面的右下角,也就是任务栏的右边.系统常驻在托盘的程序有时钟,音量控制,输入法,网络状态等.第三方应用如QQ程序也是一个典型的托盘程序,当最小化时企鹅会乖乖的待在屏幕右下角等待主人的呼唤. 系统托盘的方便之处在于,程序在暂时不用时,将它放到托盘里,随用随叫,不必将其关闭.而QQ在接收到消息后,也会在托盘中闪动提示,十分人性化. 那么如何用VC++来开发托盘程序呢?下面会用一个例子来玩转WINDOWS托盘程序. 首先,定义一下需要的功能.(需求确定

用VC制作应用程序启动画面

摘 要:本文提供了四种启动画面制作方法. 使用启动画面一是可以减少等待程序加载过程中的枯燥感(尤其是一些大型程序):二是 可以用来显示软件名称和版权等提示信息.怎样使用VC++制作应用程序的启动画面呢?本文提供四种方法.前三种适用于基于文档的应用程序,第四种适用于基于对话框的应用程 序. 1.利用组件库中的Splash Screen组件实现 (1)用Photoshop等制作启动画面图像,保存为bmp格式. (2)用Appwizard建一个基于单文档的工程Splash. (3)在资源中插入位图资源