分类: 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. 控制台telnet连接后无法关闭

    按下ctrl+]然后再quit就可以close connection

  2. SecureCRT和SecureFx设置中文乱码

    SecureCRT和SecureFx设置中文乱码 SecureCRT和SecureFx连接服务器时中文显示乱码,找了好多资料好久都没整出来,后来整出来了,因此把个人的解决办法提供出来,已变帮助更多的人 ...

  3. visual foxpro命令

    根据条件查看已打开dbf表单的记录----LIST ALL FIELDS FOR =''   最后按一下enter键

  4. C#中关于异步的三种写法

    1 投票 IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null); while (!ar.IsCompleted) class Program { ...

  5. 在svg中的line和path根据路径返回x,y

    由于path有自带的api可获得总长度,和某个长度返回的坐标. var total = d.path.getTotalLength();//返回总长度 var point = d.path.getPo ...

  6. C++的一些小的知识点

    1.初始化: 对于内置类型 ]; // 10个未初始化int ](); // 10个值初始化为0的int 对于自定义类型: 只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化 ...

  7. ---JS canvas学习笔记

    context的fillStyle属性 fillStyle=color | gradient | image | canvas |video strokeStyle也有上述属性. 1.color:#f ...

  8. position与z-index的关系

    .simulationgame .gameranking .rankinginfo{ width:140px; margin:0 auto; font-family:Arial, Microsoft ...

  9. 关于Ajax load页面中js部分$(function(){})的执行顺序

    <script type="text/javascript"> console.error(11111); $(function(){ console.error(22 ...

  10. 通过js获得html标签的值

    js获取html元素的值并赋值 1).input文本框 <input type="text" value="时间" placeholder="姓 ...