分类: c/c++ 2008-10-16 22:07 756人阅读 评论(1) 收藏 举报

exe与dll的自我更新    

在改写一个软件的自动更新程序时遇到一个问题
exe与dll在载入的时候是不能覆盖与删除的...
自动更新的时候,如何把用http/ftp下载下来的新版本替换旧版本
第一种是最老土的办法:
假设a.exe要更新自己, down下来为a.exe.upd, 关闭自己,并execute一个第三方程序b.exe,
b.exe 功能就是 将a.exe.upd拷贝替换a.exe,再execute a.exe
优点:用几个简单的api就能搞定,基本上没什么难度...许多软件/游戏的自动更新程序用这种办法
缺点:适应性差,不能用于被别的程序占用文件的改写,只能用于exe文件,而且名称之类相对固定,需要第三方程序

第二种重启计算机大法
一般的安装程序都用此法,象驱动程序,系统软件安装,均提示需要重启电脑生效,
这种方法涉及到一个关键的API  ::MoveFileEx 些函数详见MSDN

BOOL MoveFileEx(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName,
  DWORD dwFlags
);


它的第三个参数使用
MOVEFILE_DELAY_UNTIL_REBOOT标志与MOVEFILE_REPLACE_EXISTING标志时
将在电脑启动时,自动替换文件...
以下是半伪半真代码...
a.exe 下载新版本a.exe.upd

if succeed(deletefile( a.exe)) 
    movefile(a.exe.upd,a.exe);//如果删除成功,直接替换
else
 {
   MoveFileEx("'a.exe", "a.exe.upd",MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING);
   MessageBox("restart computer, yes/no?");
}

优点:适用性强,基本上能处理任何类型和任何情况的文件,非常保险
缺点:要重启计算机

第三种方法,也是我试过很多种后,使用的办法
前面说过exe与dll在载入的时候是不能覆盖与删除的,但是它能被改名
a.exe 下载新版本a.exe.upd
先将a.exe改成a.exe.tmp,
现在a.exe.tmp是不能被删除与覆盖的,
而a.exe这个文件不存在了
将a.exe.upd改名为a.exe
再关闭自己,重新启动a.exe,这时a.exe已经是新版的了

DeleteFile("a.exe.tmp");//以防万一,删除a.exe.tmp
Rename("a.exe","a.exe.tmp");
if SUCCEED(Rename("a.exe.upd","a.exe")){ 
 Execute("a.exe");
    CloseSelf();
}
else{
//特殊情况,连a.exe.tmp都被占用了,按第二种方法重启处理吧
}

优点:自己搞定,简单明了
缺点:不能用于被别的程序占用文件的改写,只能用于exe或者dll文件

<转>exe & dll自我更新的更多相关文章

  1. Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)

    原文:Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新) 程序如何自己更新自己呢?你可能会想到启动一个新的程序或者脚本来更新自己.然而 Windows 操作系统允许一个应 ...

  2. Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)

    1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...

  3. Unity 安卓下DLL热更新一(核心思想)

    大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll热更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章 ...

  4. Unity3d dll 热更新 基础框架

    APK包装到用户手机上后,代码如何更新,总不能全用LUA吧?特别是代码非常多的战斗手游 昨晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + v ...

  5. Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作

    Visual Studio 2017中使用正则修改部分内容   最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...

  6. C# exe dll防止反编译-- dotNET_Reactor

    新建两个VS C#工程test.sln 和 reactor.sln test工程代码中初始化时,删除reactor.exe 生成test工程 用软件 dotNET_Reactor 设置,保存成 set ...

  7. Core 2.0 的dll实时更新、https、依赖包变更问题及解决

    今天所有开发环境已经迁移到mac OS下的Visual Studio Code + 命令行编译发布,而运行服务器是CentOS7,和windows没什么关联了. 只要你Relese编译并在本地有一个与 ...

  8. 如何使用ILAsm与ILDasm修改.Net exe(dll)文件

    一.背景 最近项目组新上项目,交付的时间比较急迫,原本好的分支管理习惯没有遵守好,于是出现下面状况: 多个小伙伴在不同的分支上开发. 原本QA环境也存在一个阻碍性的bug A 一位同事在QA环境发布了 ...

  9. 在制作跨平台的 NuGet 工具包时,如何将工具(exe/dll)的所有依赖一并放入包中

    NuGet 提供了工具类型的包支持,生成一个基于 .NET Core 的 dll 或者基于 .NET Framework 的 exe 之后,你几乎可以对项目做任何事情.但是,默认情况下,NuGet 不 ...

随机推荐

  1. Net通用进销存管理系统 + 开发文档+ 使用说明

    通用进销存管理系统 + 开发文档+ 使用说明Net源码下载 包括下面的模块基础资料模块采购管理模块库存管理模块商务管理模块营业管理模块维修管理模块会员管理模块财务管理模块 Net通用进销存管理系统 + ...

  2. 使用Linux碎解一

    一.安装VMwarestation. 二.安装Linux系统(这里是CentOS7) 步骤: #==========================part1===================== ...

  3. asp.net 对数据库表增加,删除,编辑更新修改

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  4. Android菜鸟成长记13 -- 初识application

    二.Application 简介 Application 类是用来维护应用程序全局状态.你可以提供自己的实现,并在 AndroidManifest.xml文件的 <application> ...

  5. vim安装不上

    前阵子,刚安装Ubuntu时,安装vim的问题,现在些出来分享一下.apt-get install vim正在读取软件包列表... 完成正在分析软件包的依赖关系树正在读取状态信息... 完成有一些软件 ...

  6. 手动安装m4, autoconf, automake, libtool

    转自http://ruby-china.org/topics/2434 系列文章原载于自己的博客,TOPI.CO (http://topi.co) ,某天不小心就push错啦,懒得从头再来,上传到Ru ...

  7. 我的新博客:www.wangyufeng.org

    新博客:www.wangyufeng.org 博客园的博客不更新啦.

  8. Data import/export of Netezza using external table

    Introduction External table is a special table in Netezza system, which could be  used to import/exp ...

  9. 开启gpu加速的高性能移动端相框组件!

    通过设置新的css3新属性translateX来代替传统的绝对定位改变left值的动画原理,新属性translateX会开启浏览器自带的gpu硬件加速动画性能,提高流畅度从而提高用户体验, 代码有很详 ...

  10. css:去掉手机浏览器上点击时的边框和阴影

    outline:none;(去掉蓝框) -webkit-tap-highlight-color:rgba(0,0,0,0) ;(去掉阴影)适用于ios,Android