桌面软件的智能更新
——MagicUpdate更新原理
Email: qmroom#126.com [# = @]
测试环境:Win2000/XP/2003/Vista/Windows7
关键字:更新、多线程、断点续传、Ftp、Exe互嵌
MagicUpdate下载,请与本人联系
索引
1 摘要:
1.1 使用到的技术:
1.2 更新流程
1.3 模块划分
2 界面展示
3 络及多线程技术
3.1 多线程下载和断点续传
3.2 Ftp上传下载
3.3 多线程与主线程(界面)的数据交互
4 更新细节
4.1 更新模式
4.2 文件结构设计
4.2.1 服务器端文件信息
4.2.2 客户端文件信息ClientConfig结构
4.2.3 管理端文件信息ManagerConfig结构
4.2.4 宏说明及文件路径的计算
4.3 更新详细流程
4.3.1 管理端流程
4.3.2 客户端流程
4.4 客户端命令行
4.5 自我升级
5 小结
1 摘要:
随着桌面软件文件的增多增大、版本升级频繁,有时因为改动了几个很小的几个dll文件,客户不得不从 站上重新下载整个安装包。并且开发人员不得不从繁忙的工作中抽出大量的时间来维护版本的升级,导致开发成本增加、维护难度大等诸多问题。有没有更完美的解决方案,来让软件自动升级到新版本呢案当然是肯定的。在当今 络技术技术迅速发展的时代,各个软件厂商各有各自的升级方法,现在我就谈谈我的解决方案。
1.1 使用到的技术:
关键技术:
l 多线程管理及交互
l Http下载和断点续传
l Ftp上传下载
l Vc++对Xml读写解析
l Md5算法
l 可执行程序Exe的相互嵌套
控件技术:
l 自定义三态树形控件CTreeCtrl和CListCtrl的互动
l 控件的自绘制
1.2 更新流程
1. 管理端上传当前版本的文件到服务器;
2. 客户端先自我更新,然后更新产品。获取服务器信息,判断是否需要更新。若需要则提示用户更新。
客户端:
自动模式下的更新提示:
3 络及多线程技术
3.1 多线程下载和断点续传
桌面软件的升级的方法有很多,如何自动的升级,当然少不了数据传输程序。为了能够穿透防火墙在广域 使用我采用了基于http的下载。
原理大致如下:
1. 创建一个的空文件,大小为需要下载的文件大小+零时数据大小;
2. 创建多个线程,同时利用CreateFile共享写打开临时文件,移动文件指针到数据块开始区域;
3. 使用WinNet API,建立多个服务器连接,向服务器请求同一个文件的不同数据段的数据保存到同一个临时文件,并保存已下载的数据大小;
4. 数据都读完后,修改文件大小为原来大小。
若下载中途 络中断,下次下载时,则可以从尾部文件信息中获取已下载的大小,便于继续上一次的下载。实现起来当然要考虑诸多细节方面,由于篇幅有限,就不详细说明。
3.2 Ftp上传下载
利用WinNet函数很容易实现Ftp的上传下载,这里就不详细说明。
3.3 多线程与主线程(界面)的数据交互
交互的实现很复杂,用到了指针,回调函数,自己的消息队列等。要全部讲清楚确不容易,我就简要介绍一下。
1. 定义消息结构
typedef struct _NotifyW3ctPara
{
int nIndex; //同一个下载文件中线程索引
UINT nNotityType; //消息类型
DWORD dwContent; //通过StartDownload参数传入的值
LPVOID lpNotifyData; //消息数据
W3CT *pThread; //下载模块指针
}NotifyW3ctPara;
2. 定义消息存储数组和回调函数
typedef CArray<NotifyW3ctPara, NotifyW3ctPara&> ArrayNotifyW3ctPara;
// 消息通知回调函数
typedef void (*FunPtr_NotifyW3ct)(NotifyW3ctPara *);
3. 处理消息
//添加消息
BOOL UpdateProcCtrl::Add_NotifyPara(NotifyW3ctPara *pNotifyPara)
{
…
NotifyW3ctPara notifypara = {0};
memcpy(¬ifypara, pNotifyPara, sizeof(NotifyW3ctPara));
m_csNotifyPara.Lock();
…
try{
m_aryNotifyW3ctPara.Add(notifypara);
…
}
catch(CMemoryException *e){
…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!