在您的服务器上打包新程序,以及一个配置规范文件(ini 或 xml)。当你的程序运行的时候,启动一个慢线程,下载你的配置描述文件(ini或者xml),和本地的比较一下,一致的话直接退出,如果有更新就下载到临时目录下。这都是小事,关键是如何覆盖原来对应的文件,因为在系统运行的时候,文件是不能删除和覆盖的。
我有四种方法
首先,如果只是某个EXE或DLL发生了变化,先重命名本地的,然后直接复制覆盖(当然得想办法删除重命名的文件)。我现在做的浏览器就是用这个方法,但是还有改进的空间,现在只是简单了。
第二个是写一个额外的DLL文件。我将其命名为 .dll。这个模块实际上只是文件的一个副本。当我的工作系统退出时,我通过 .exe(带有一些附加参数)调用我的 .dll,然后我自己的系统退出。 .dll被.exe加载后,等到工作系统退出,再从附加参数中解析出要复制的文件,进行复制操作。并且可以做得更好,即.dll作为工作系统的资源,在需要的时候动态写入文件执行,完成后可以自行删除(比EXE 文件)。这种方法以前在做大型系统的时候用过。
三是使用没有特定功能的EXE(暂称为shell.exe)来调用真正有意义的功能模块。 Shell.exe负责判断工作系统的版本并下载相关组件,并在适当的时候关闭并覆盖工作系统。由于 shell.exe 非常实用,几乎不需要升级。当然也可以做得更好,就是在工作系统适应的时候,更新shell.exe,呵呵。该程序目前正在使用中。
第四个方案和第三个方案类似,但是功能模块不是普通的EXE或者DLL,而是一个脚本,就像浏览器执行一个JS脚本一样。不过这个脚本是行业相关的,功能可以更强大,升级当然更容易。现在我正在尝试扩展脚本,希望它可以轻松应用到普通的小程序中。呵呵
Q:升级会涉及到注册表等的变化,不是简单的拷贝升级。
对于shell.exe,它的启动时间是多少?如何自动启动?
A:“升级将涉及对注册表等的更改,而不是简单的副本升级。”如果升级会因为注册表的问题而造成混乱,那么设计一定是很不合理的。考虑设计问题。升级要多考虑三个方面,一是判断各个模块版本信息的问题,二是各个模块的下载问题,三是覆盖问题。这三个方面中,最后一个问题是最重要的,因为各种原因可能只有部分模块能够成功覆盖,这可能需要版本回滚或其他补救方案。具体应用中如何处理,取决于项目的性质和公司的习惯。
“对于,shell.exe,它的启动时间是多少?怎么启动?”,我已经说的很清楚了,这个shell.exe其实是一个入口,当然,它是在开头运行的。这个过程是先判断是否更新真实应用系统(如果是,先更新)Chrome 自动升级后,本地项目都无法访问,然后启动真实业务应用系统。
Q:谢谢你的回复,现在有一个问题:你在回复中提到“写一个额外的.DLL文件,当工作系统退出时Chrome 自动升级后,本地项目都无法访问,通过.exe调用我的.dll”,这个“在工作中 退出时如何通过.exe调用我的.dll?我的vc不太好,谢谢指教!
A:可以查看.exe相关信息。
评论留言