用VB6写在线更新程序(上篇)(3/3)
与Delphi中不同的是,读取一个结点的属性值时,要判断属性的存在性,试图读取返回的空值将引发错误。 解析得到的值保存在XmlConfiguration类的属性中,而文件列表通过一个数组来保存。这里又遇到一个问题:索引属性,这个概念不好解释,还是看代码吧:
这里并不实现写(Let)属性,而是通过AddFile方法实现添加文件到列表(似乎只许添加,不许修改了),当然提供清空的方法是必要的:
悲哀的是,在写这个类时,没未找到用API函数SafeArrayGetDim判断VB空数组主方法,使用1个元素的数组来表示空,后来也懒得改回去了,所以List数组至少会有一个元素(流汗ing…)! 这里还用到一个自定义类:XMLFile,里面只定义了FileName、Target、FileVersion、FileDate与FileMain四个读写属性,对应XML配置文件中文件结点的name、target、version、date与main属性。在Delphi里定义一个record(记录)类型就可以,VB中我试过定义一个Type(类型)的,但好像不行。会提示下面的错误(不好意思,装的英文版本,慢慢翻译),郁闷!
至此,XmlConfiguration类对于更新程序是够用了,但为了类定义的完整,也为了在发布程序调用,还是要定义一下Save方法,将XML配置写入到XML文件中:
这个方法是Analysis的逆过程,但相比复杂一些,因为保存时要查找对应的子结点,如果找不到(不存在)还要创建一个新的结点;类似地,结点属性也需要这样做。如果连XML配置文件都不存在,还要创建一个空的XML文档框架。而查找结点用GetChildNode函数,这个函数会在指定的父结点下查找指定名称的子结点,如果找不到则创建一个新的子结点并返回;同理,设置属性用SetNodeAttr函数,它会查找指定结点指定名称的属性,如果不存在也会创建新的属性,并将属性值设置指定的值。 至此,XmlConfiguration就算完成了,接下来是依据文件列表逐个比较文件的版本号(或最后修改日期),需要更新的,则从指定路径将文件下载下来将旧文件覆盖。这里要注意一点:下载的源路径中加入了time参数,指定当前时间,目的在于防止Windows自动从缓存中直接下载以前下载的旧文件。
这里用到3个(可能更多,中篇中一并贴出)函数:一个是获取文件版本号的函数GetFileVersion;一个是获取文件最后修改时间的函数GetFileModifiedDate,还有一个是用来比较两个版本号新旧的函数CompareVersion。由于本篇写得太长了,留到中篇(中篇也太短了!)吧。最后用到的函数RunCmdLine,是用于运行DOS命令的,需要用到WinExec(还是API函数,晕)。 而这里的难点是下载进度提示的实现,窗体中放置了进度条ProgressBar1,而要实现单个文件下载进度的显示,需将窗体本身(在其它类实现这个接口我没搞定,有点深奥)定义为实现IBindStatusCallback接口,在窗口开头写上这一句即可(在网上搜了很久才找到的方法,挺别扭的^_^): Implements olelib.IBindStatusCallback 然后实现IBindStatusCallback的OnProgress方法(相当于写事件处理过程),实现对进度提示的更新:
这里还要用到olelib.tlb文件,也是网上搜了的,似乎比较稀有。既然进度条有了,当然也少不了取消按钮(下载进程及久时让人有取消的机会还是很必要滴!这是友好界面的标准,呵呵,自吹一下)。当然,为了更加方便于更新程序的高度与错误检查,还实现了更新日志(文本)文件的记录,对VB的文件读写不太熟悉,这里仅实现了想要的功能,没有再去深究。 这就是上篇,更新程序的编写,下一步计划写中篇(主程序的更新检测)及下篇(更新发布程序的编),敬请继续关注。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |