桌面软件的智能更新——MagicUpdate更新原理.doc_第1页
桌面软件的智能更新——MagicUpdate更新原理.doc_第2页
桌面软件的智能更新——MagicUpdate更新原理.doc_第3页
桌面软件的智能更新——MagicUpdate更新原理.doc_第4页
桌面软件的智能更新——MagicUpdate更新原理.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

桌面软件的智能更新MagicUpdate更新原理作者:陈秋明Email: qmroom#126.com # = 测试环境:Win2000/XP/2003/Vista/Windows7关键字:更新、多线程、断点续传、Ftp、Exe互嵌MagicUpdate下载,请与本人联系本文PDF下载索引1 摘要:. 21.1 使用到的技术:. 21.2 更新流程. 31.3 模块划分. 32 界面展示. 53 网络及多线程技术. 73.1 多线程下载和断点续传. 73.2 Ftp上传下载. 73.3 多线程与主线程(界面)的数据交互. 84 更新细节. 104.1 更新模式. 104.2 文件结构设计. 104.2.1 服务器端文件信息. 114.2.2 客户端文件信息ClientConfig结构. 134.2.3 管理端文件信息ManagerConfig结构. 144.2.4 宏说明及文件路径的计算. 154.3 更新详细流程. 164.3.1 管理端流程. 164.3.2 客户端流程. 174.4 客户端命令行. 184.5 自我升级. 195 小结. 201 摘要:随着桌面软件文件的增多增大、版本升级频繁,有时因为改动了几个很小的几个dll文件,客户不得不从网站上重新下载整个安装包。并且开发人员不得不从繁忙的工作中抽出大量的时间来维护版本的升级,导致开发成本增加、维护难度大等诸多问题。有没有更完美的解决方案,来让软件自动升级到新版本呢?答案当然是肯定的。在当今网络技术技术迅速发展的时代,各个软件厂商各有各自的升级方法,现在我就谈谈我的解决方案。1.1 使用到的技术:关键技术:l 多线程管理及交互l Http下载和断点续传l Ftp上传下载l Vc+对Xml读写解析l Md5算法l 可执行程序Exe的相互嵌套控件技术:l 自定义三态树形控件CTreeCtrl和CListCtrl的互动l 自定义CListCtrl,实现控件互嵌(进度条、编辑框、下拉框)l 控件的自绘制1.2 更新流程1. 管理端上传当前版本的文件到服务器;2. 客户端先自我更新,然后更新产品。获取服务器信息,判断是否需要更新。若需要则提示用户更新。1.3 模块划分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 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) m_csNotifyPara.Unlock ();/清空消息void UpdateProcCtrl:Clear_NotifyPara() m_csNotifyPara.Lock(); m_aryNotifyW3ctPara.RemoveAll(); 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(pNotifyPara-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.Unlock(); for ( int i=0; iaryNotifyW3ctPara.GetSize(); i+ ) NotifyW3ctPara &NotifyPara = aryNotifyW3ctPara.GetAt(i); Deal_Notify(&NotifyPara); return TRUE;这里的消息处理大致就是这样,中间传输考虑很多同步互斥。如果您对win的内核对象很了解,看这些代码相信不是什么难事,中间省略掉代码可以自己发挥了。需要注意的是,多线程处理时线程间通信、交互以及取消线程都应该是安全的,不要使用TerminateThread, TerminateProcess等这些不安全的API,如果使用了他们,那么你的程序执行结果将是不可预料的。4 更新细节4.1 更新模式更新模式分为MD5比较和文件版本号比较MD5比较,即先计算文件的md5值,根据md5值判断文件是否变化;版本号比较,即直接判断文件版本号是否是最新4.2 文件结构设计文件信息分为三个部分:客户端信息、管理端信息、服务器端信息。服务器端信息又分为状态信息和文件信息。4.2.1 服务器端文件信息 服务器状态信息ServerStatus结构 服务器文件信息ServerConfig结构4.2.2 客户端文件信息ClientConfig结构4.2.3 管理端文件信息ManagerConfig结构4.2.4 宏说明及文件路径的计算服务器端宏说明(?ServerDir) - 和服务器配置文件同一目录(?ServerRoot) - 根目录(?None) - 空客户端宏说明(?LocalFullPathName)- 本地绝对路径,ExecuteCommand中用(?LocalDir) - 和本地配置文件同一目录(?None) - 空以后可能会添加支持系统环境变量例如:如果服务器配置文件地址为:http:/localhost/update/ServerConfig.xml,则 (?ServerDir) = http:/localhost/update/,(?ServerRoot) = http:/localhost/服务器端文件真实地址计算方法: 如果server_root=(?None),则表示真实地址, 如果含有:/表示绝对地址,否则应加上(?ServerDir),等于(?ServerDir)/; 如果server_root=(?ServerDir),则(?ServerDir)/表示真实地址; 如果server_root=(?ServerRoot),则(?ServerRoot)/表示真实地址;支持的节点:ServerPathName,ExecuteCommand本地路径计算方法类似。支持的节点:LocalPathName文件比较方法分为MD5法和版本号比较法。当为版本号比较时,将配置文件LocalPathName换成绝对路径,再比较版本号。此时,文件路径中请不要包含.和.,否则比较路径会不正确。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:serchpath/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) /updatetest - 更新服务器上的测试版本 /s: - 显示类型 a - 自动执行;,等同/s:ap1,ap2,ap3;但不会自动退出,有则更新 ap1 - 自动执行页面1 ap2 - 自动执行页面2 ap3 - 自动执行页面3 ae - 自动退出,等同/s:aep1,aep2,aep3; aep1 - 自动退出页面1 aep2 - 自动退出页面2 aep3 - 自动退出页面3 fu - 有更新时,提示 fn - 没有更新时,提示 fs - 更新成功时,提示 fe - 更新失败时,提示 ff - 更新完成时提示时,提示;等同/s:fs,fe fa - 提示全部;等同/s:fu,fn,ff hpa - 隐藏所有页面;等同/s:hp1,hp2,hp3 hp1 - 隐藏页面1 hp2 - 隐藏页面2 hp3 - 隐藏页面3 /noupdateself - 不进行自我更新 /r - 快退出时,执行 exepath /f - 自动搜索 serchpath 目录下的匹配的 muc 文件;若省略,则搜索工作路径 mucpath - muc 文件路径 /h/? - 显示本帮助4.5 自我升级大家知道,程序在运行时,不能改写和删除自己。要改写自己最简单的方法就是创建一个新进程B,由新的进程B改写原来的进程A。因此我按照如下的步骤实现自我更新。1. 新建一个空的Win32工程“EmbedUpdateSelf”。在WinMain函数中添加更改原程序的代码,做好接口调用;2. 手动编辑原项目工程下的resMagicUpdateWizard.rc2资源,以便在原程序中嵌入新的程序,在需要更新时,原程序从资源中读出数据并写到文件中。添加如下代码:#ifdef _DEBUGIDR_EMBEDUPDATESELF EmbedUpdateSelf .BinEmbedUpdateSelfd.exe#elseIDR_EMBEDUPDATESELF EmbedUpdateSelf .BinEmbedUpdateSelf.exe#endif3. 在更新服务器上放置需要更新的ZIP压缩包;4. 在A进程中判断是否需要更新,下载压缩包,启动进程B,由B进程解压缩ZIP,并负责A的更新;5. 更新成功后,再次用A原来的命令行启动进程A;6. 删除任何用的的临时文件。5 小结更新程序的大致原理粗糙的讲述完,篇幅所限在实际运用中还有很多的细节没有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论