exe与dll的自我更新
来源:互联网 发布:淘宝充值网店代理加盟 编辑:程序博客网 时间:2024/06/06 16:34
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在载入的时候是不能覆盖与删除的...
自动更新的时候,如何把用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的自我更新
- dll与exe的区别
- dll lib exe的联系与区别
- ActiveX EXE与ActiveX DLL的区别
- DLL与EXE
- exe与dll文件
- 关于PDB与EXE/DLL 文件的匹配问题(转)
- pdb文件与dll/exe文件的关联。
- exe函数与dll函数的相互调用
- OBJ、LIB、DLL与EXE之间的关系
- 用WinRAR将exe与所依赖的dll与资源打包成一个exe
- 获取SVN版本信息更新exe,dll文件的版本信息(C++, C#)
- 在VC中创建DLL文件的方法步骤--DLL文件与exe文件的区别
- myplay.pif、winsys16.dll、scrsys16.dll和AlxRes.exe的分析与解决
- 在DLL间或者DLL与EXE之间传递vector对象或指针的问题
- EXE、DLL文件的脱壳
- DLL和EXE的区别
- DLL和EXE的配合
- MySQL STRAIGHT_JOIN 与 NATURAL JOIN(五)
- java继承---->类的复用
- printf()函数实现串口打印的配置方法
- 代理服务器不断提示输入账号密码:通过修改账户密码解决
- 安卓开发——跟随手指的小球
- exe与dll的自我更新
- Eclipse统计代码行数的最简单方法
- Neusoft机房改善计划 第二弹
- hibernate打印出来的 db2分页SQL
- Some Links
- 有关“System.Diagnostics.Process”
- jquery 回车事件
- 冒泡排序
- 世界上最励志、最传奇的创业家Elon Musk的一天