桌面软件的智能更新——magicupdate更新原理

上传人:wt****50 文档编号:37983093 上传时间:2018-04-25 格式:DOC 页数:31 大小:1,014.50KB
返回 下载 相关 举报
桌面软件的智能更新——magicupdate更新原理_第1页
第1页 / 共31页
桌面软件的智能更新——magicupdate更新原理_第2页
第2页 / 共31页
桌面软件的智能更新——magicupdate更新原理_第3页
第3页 / 共31页
桌面软件的智能更新——magicupdate更新原理_第4页
第4页 / 共31页
桌面软件的智能更新——magicupdate更新原理_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《桌面软件的智能更新——magicupdate更新原理》由会员分享,可在线阅读,更多相关《桌面软件的智能更新——magicupdate更新原理(31页珍藏版)》请在金锄头文库上搜索。

1、桌面软件的智能更新MagicUpdate 更新原理作者:陈秋明Email: qmroom# # = 测试环境:测试环境:Win2000/XP/2003/Vista/Windows7Win2000/XP/2003/Vista/Windows7关键字:更新、多线程、断点续传、关键字:更新、多线程、断点续传、FtpFtp、ExeExe 互嵌互嵌MagicUpdate 下载,请与本人联系本文 PDF 下载索引索引1 摘要:1.1 使用到的技术:1.2 更新流程1.3 模块划分2 界面展示3 网络及多线程技术3.1 多线程下载和断点续传3.2 Ftp 上传下载3.3 多线程与主线程(界面)的数据交互4

2、更新细节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 文件,客户不得不从网站上重新下载整个安装包。并且开发人员不得不从繁忙的工作中抽出大量的时间来维护版本的升级,导致开发成本增加、维护难度大等诸多问题。有没有更完美的解决方案,

3、来让软件自动升级到新版本呢?答案当然是肯定的。在当今网络技术技术迅速发展的时代,各个软件厂商各有各自的升级方法,现在我就谈谈我的解决方案。1.1 使用到的技术:使用到的技术:关键技术: 多线程管理及交互 Http 下载和断点续传 Ftp 上传下载 Vc+对 Xml 读写解析 Md5 算法 可执行程序 Exe 的相互嵌套控件技术: 自定义三态树形控件 CTreeCtrl 和 CListCtrl 的互动 自定义 CListCtrl,实现控件互嵌(进度条、编辑框、下拉框) 控件的自绘制1.2 更新流程更新流程1. 管理端上传当前版本的文件到服务器;2. 客户端先自我更新,然后更新产品。获取服务器信息

4、,判断是否需要更新。若需要则提示用户更新。1.3 模块划分模块划分2 界面展示界面展示管理端:客户端:自动模式下的更新提示:升级程序自我更新:3 网络及多线程技术网络及多线程技术3.1 多线程下载和断点续传多线程下载和断点续传桌面软件的升级的方法有很多,如何自动的升级,当然少不了数据传输程序。为了能够穿透防火墙在广域网使用我采用了基于 http 的下载。原理大致如下:1. 创建一个的空文件,大小为需要下载的文件大小+零时数据大小;2. 创建多个线程,同时利用 CreateFile 共享写打开临时文件,移动文件指针到数据块开始区域;3. 使用 WinNet API,建立多个服务器连接,向服务器请

5、求同一个文件的不同数据段的数据保存到同一个临时文件,并保存已下载的数据大小;4. 数据都读完后,修改文件大小为原来大小。若下载中途网络中断,下次下载时,则可以从尾部文件信息中获取已下载的大小,便于继续上一次的下载。实现起来当然要考虑诸多细节方面,由于篇幅有限,就不详细说明。3.2 Ftp 上传下载上传下载利用 WinNet 函数很容易实现 Ftp 的上传下载,这里就不详细说明。3.3 多线程与主线程(界面)的数据交互多线程与主线程(界面)的数据交互交互的实现很复杂,用到了指针,回调函数,自己的消息队列等。要全部讲清楚确不容易,我就简要介绍一下。1. 定义消息结构typedef struct _

6、NotifyW3ctParaint nIndex; /同一个下载文件中线程索引UINT nNotityType; /消息类型DWORD dwContent; /通过 StartDownload 参数传入的值LPVOID lpNotifyData; /消息数据W3CT *pThread; /下载模块指针NotifyW3ctPara;2. 定义消息存储数组和回调函数typedef CArray ArrayNotifyW3ctPara;/ 消息通知回调函数typedef void (*FunPtr_NotifyW3ct)(NotifyW3ctPara *);3. 处理消息/添加消息BOOL Upda

7、teProcCtrl:Add_NotifyPara(NotifyW3ctPara *pNotifyPara)NotifyW3ctPara notifypara = 0;memcpy(m_csNotifyPara.Lock();trym_aryNotifyW3ctPara.Add(notifypara);catch(CMemoryException *e)m_csNotifyPara.Unlock ();/清空消息void UpdateProcCtrl:Clear_NotifyPara()m_csNotifyPara.Lock();m_aryNotifyW3ctPara.RemoveAll();

8、m_csNotifyPara.Unlock();/消息回调函数void UpdateProcCtrl:Callback_Notify(NotifyW3ctPara *pNotifyPara)AppSetting:g_UpdateProcCtrl.Add_NotifyPara(pNotifyPara);:SendMessage(g_main_wnd-GetSafeHwnd(), WM_TRANSFER_NOTIFY, NULL, NULL);/消息处理void UpdateProcCtrl:Deal_Notify(NotifyW3ctPara *pNotifyPara)switch(pNotif

9、yPara-nNotityType)case NTD_THREAD_TANSFER_SIZE:/在这里计算下载的速度、进度等break;/消息传输LRESULT UpdateProcCtrl:OnTransferNotify(WPARAM wParam, LPARAM lParam)ArrayNotifyW3ctPara aryNotifyW3ctPara;m_csNotifyPara.Lock();aryNotifyW3ctPara.Append(m_aryNotifyW3ctPara);m_aryNotifyW3ctPara.RemoveAll();m_csNotifyPara.Unloc

10、k();for ( int i=0; i表示真实地址, 如果含有“:/“表示绝对地址,否则应加上(?ServerDir),等于(?ServerDir)/;如果 server_root=“(?ServerDir)“,则(?ServerDir)/表示真实地址;如果 server_root=“(?ServerRoot)“,则(?ServerRoot)/表示真实地址;支持的节点:ServerPathName,ExecuteCommand本地路径计算方法类似。支持的节点:LocalPathName文件比较方法分为 MD5 法和版本号比较法。当为版本号比较时,将配置文件 LocalPathName换成绝对

11、路径,再比较版本号。此时,文件路径中请不要包含“.“和“.“,否则比较路径会不正确。4.3 更新详细流程更新详细流程4.3.1 管理端流程管理端流程4.3.2 客户端流程客户端流程4.4 客户端命令行客户端命令行用法: MagicUpdateWizard /automation /normal /close:hWnd,Msg,wParam,lParam /background /debug/s:a,ap1,ap2,ap3,ae,aep1,aep2,aep3,fu,fn,fs,fe,ff,fa,hpahp1,hp2,hp3/noupdateself /r:exepath /h/? /f:serc

12、hpath/mucpath/automation - 自动执行更新,等同/s:fu,ap1,aep1,hp1,ap2,hp2,aep2;若没有更新会自动退出;显示更新进度/normal - 正常模式,等同/s:ap1,aep1,hp1;隐藏页面 1/close:hWnd - 更新前发送关闭通知给窗口句柄 hWnd(十进制);Msg 消息类型(十进制),默认 WM_CLOSE;wParam,lParam 消息参数/background - 后台运行;等同/s:a,ae,hpa;若有更新将自动升级,没有更新自动退出;看不见窗口/debug - 调试模式(包含/updatetest)/updatet

13、est - 更新服务器上的测试版本/s: - 显示类型a - 自动执行;,等同/s:ap1,ap2,ap3;但不会自动退出,有则更新ap1 - 自动执行页面 1ap2 - 自动执行页面 2ap3 - 自动执行页面 3ae - 自动退出,等同/s:aep1,aep2,aep3;aep1 - 自动退出页面 1aep2 - 自动退出页面 2aep3 - 自动退出页面 3fu - 有更新时,提示fn - 没有更新时,提示fs - 更新成功时,提示fe - 更新失败时,提示ff - 更新完成时提示时,提示;等同/s:fs,fefa - 提示全部;等同/s:fu,fn,ffhpa - 隐藏所有页面;等同/

14、s:hp1,hp2,hp3hp1 - 隐藏页面 1hp2 - 隐藏页面 2hp3 - 隐藏页面 3/noupdateself - 不进行自我更新/r - 快退出时,执行 exepath/f - 自动搜索 serchpath 目录下的匹配的 muc 文件;若省略,则搜索工作路径mucpath - muc 文件路径/h/? - 显示本帮助4.5 自我升级自我升级大家知道,程序在运行时,不能改写和删除自己。要改写自己最简单的方法就是创建一个新进程 B,由新的进程 B 改写原来的进程 A。因此我按照如下的步骤实现自我更新。1. 新建一个空的 Win32 工程“EmbedUpdateSelf”。在 WinMain 函数中添加更改原程序的代码,做好接口调用;2. 手动编辑原项目工程下的 resMagicUpdateWizard.rc2 资源,以便在原程序中嵌入新的程序,在需要更新时,原程序从资源中读出数据并写到文件中。添加如下代码:#ifdef _DEBUGIDR_EMBEDUPDA

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号