今天又碰到需要做一个简单的自动升级的客户端程序,
客户端程序在拿到升级包并且解压之后,怎样自更新并再启动呢?
这里我封装了一个类,利用批处理,将升级文件覆盖掉本地文件,然后重启动应用程序。
#ifndef KILL_MYSELF_H_
#define KILL_MYSELF_H_
#include <iostream>
#include <vector>
class UpdateMyself
{
public:
UpdateMyself()
{
m_Files.clear();
}
//设置更新目录
void SetDir( std::string dir )
{
m_UpdateDir = dir;
}
//增加更新文件
void AddFile( std::string filename )
{
m_Files.push_back( filename );
}
//设置启动应用名
void SetStartApp( std::string appname )
{
m_StartApp = appname;
}
//执行
void Execute()
{
//建立更新批处理文件
FILE *fp;
fp = fopen( "update.bat" , "w+" );
fprintf( fp , "@echo off\n" );
//覆盖本地文件
for( std::vector<std::string>::iterator iter = m_Files.begin(); iter != m_Files.end(); ++iter )
{
std::string filename = *iter;
fprintf( fp , "del %s\n", filename.c_str() );
fprintf( fp , "copy .\\%s\\%s %s\n", m_UpdateDir.c_str(), filename.c_str(), filename.c_str() );
fprintf( fp , "del .\\%s\\%s\n", m_UpdateDir.c_str(), filename.c_str() );
}
//自杀
fprintf( fp , ":begin\n" );
fprintf( fp , "del %s\n", m_StartApp.c_str() );
fprintf( fp , "if exist %s goto begin\n", m_StartApp.c_str() );
fprintf( fp , "copy .\\%s\\%s %s\n", m_UpdateDir.c_str(), m_StartApp.c_str(), m_StartApp.c_str() );
//fprintf( fp , "rd/q %s\n", m_UpdateDir.c_str() );
fprintf( fp , "del .\\%s\\%s\n", m_UpdateDir.c_str(), m_StartApp.c_str() );
fprintf( fp , "start %s\n", m_StartApp.c_str() );
fprintf( fp , "del %%0%%\n");
fclose(fp);
WinExec("update.bat",SW_SHOW);
exit(0);
}
private:
std::vector<std::string> m_Files;
std::string m_UpdateDir;
std::string m_StartApp;
};
#endif
假设我们下载之后的更新文件都位于update目录中,我只需要
UpdateMyself test;
test.SetDir("update");
test.AddFile(...); 把要更新的文件名加进去
test.SetStartApp(...); 设置更新之后启动的应用程序名称
test.Execute();
就可以完成更新了。
分享到:
相关推荐
在Windows 7操作系统中,桌面快捷方式是一种便捷的手段,让用户快速访问常用的应用程序、文件或文件夹。快捷方式本质上是指向目标文件的指针,它们占用的硬盘空间极小,但能极大地提高用户的工作效率。"win7桌面快捷...
本篇文章将详细讲解如何利用批处理命令来运行Java程序,并结合一个名为`testjar`的示例进行说明。 首先,理解批处理命令的基本结构。一个批处理文件通常以`.bat`或`.cmd`为扩展名,由一系列DOS命令组成,每行代表一...
总结来说,批处理教材提供了一个全面的学习平台,帮助用户掌握批处理文件的创建、编辑和执行,以及如何利用批处理提高命令行操作的效率和自动化程度。通过学习,你可以创建自己的批处理程序来简化日常的计算机任务,...
针对这一需求,我们可以利用批处理(Batch Script)这种简单的脚本语言来修改系统设置,使得任务栏时间显示包含秒数。本文将详细解析这个"windows10时间显示秒数批处理bat文件"的工作原理,并介绍如何使用。 批处理...
同时,批处理的概念也扩展到了其他操作系统和应用程序,如Unix的Shell脚本,甚至某些特定用途的应用程序也采用类似批处理的文本指令文件。 总的来说,批处理是一种简单但实用的自动化工具,尤其对于系统管理员和...
1. **IIS基本结构**:理解IIS的网站、应用程序池、虚拟目录等概念,以及它们之间的关系。 2. **用户账户与权限**:了解NTFS权限和IIS进程身份(如IWAM账户、默认应用程序池身份)的设置,确保服务仅以最低权限运行...
.NET Framework 3.5是微软为开发者创建Windows应用程序提供的一套全面的开发和运行环境。在Windows 7中,该框架通常是预装的,因此用户可以直接运行此程序。然而,在其他Windows版本上,如Windows 8、10等,可能需要...
批处理文件的灵活性在于,除了DOS命令,还可以包含Windows系统中的其他命令、程序调用,甚至可以利用条件语句(如`if`)、流程控制语句(如`goto`)和循环语句(如`for`)来实现一定的逻辑控制。 批处理文件的一个...
总结起来,这个压缩包提供了在Windows环境下安装OpenSSL和Perl的步骤,以及利用批处理脚本自动化生成各种证书文件的方法。对于服务器管理员或者开发者来说,这能大大提升证书管理的效率和便利性。
nwjs-v0.48.3-win-x64是一个基于Chromium和Node.js的开源框架,...通过修改URL和使用批处理文件,开发者可以便捷地定制和打包自己的Web应用程序。对于熟悉Web开发的人员来说,nw.js提供了一条进入桌面应用开发的捷径。
首先,我们可以利用批处理脚本来实现这一目标。批处理文件(.bat)是一种简单的命令行脚本,允许用户通过编写一系列命令来执行多个任务。例如,你可以在批处理文件中列出要启动的所有程序的路径,然后只需双击该文件...
4. **多任务并行下载**:为了榨干带宽,你可以在不同的文件夹中启动多个这样的批处理文件,每个文件夹运行一个wget进程,这样就可以同时从多个源下载文件,最大化利用网络带宽。 5. **注意事项**:确保你的网络计划...
64位系统因其能够处理更大的内存和更高效的计算能力,通常能够更好地支持复杂的软件运行,因此`RunExample.bat`的设立旨在充分利用这些优势,确保Isight在Win64平台上的流畅运行。 接着,我们来看`RunExample_win32...
- Windows API是开发Windows应用程序的基础,书中可能详细讲解如何调用API函数,如CreateProcess、WriteFile、GetModuleHandle等。 - 如何通过 STDCALL调用约定与C/C++代码进行交互,理解参数压栈规则和返回值处理...
本教程将详细解释如何利用联想提供的小工具来关闭Win10自动更新。 首先,我们关注的是"关闭Win10自动更新.EXE"这个文件,这很可能是一个联想开发的专用程序,用于帮助用户简单快捷地禁用Win10的自动更新机制。在...
在Windows 7操作系统中,注册表是存储系统和应用程序配置信息的重要数据库。通过优化注册表,我们可以提升系统性能,改善启动、关闭以及程序运行的速度。以下是对提供的注册表优化文件的详细解读: 1. **开启DWM中...
在日常使用Windows 7系统的过程中,我们经常需要频繁地打开各种应用程序。对于那些不习惯使用鼠标的用户来说,利用“运行”命令来快速启动程序无疑是一种非常高效的方式。然而,这种方法的一个不足之处在于需要记住...
无盘工作站是一种计算机系统,它没有自己的硬盘驱动器,而是通过网络从服务器上启动,并且其操作系统和应用程序也是从服务器上加载的。这种方法在学校和企业培训中心等场景下非常流行,因为易于管理和维护,同时也能...
在Windows x86-64环境下,开发者需要注意的是,由于64位系统的寻址空间较大,因此可能需要调整应用程序的内存管理策略以充分利用系统资源。同时,由于64位应用程序的编译和调试可能与32位有所不同,开发者需要熟悉...
然而,这也意味着开发者需要定期更新CEF3,以确保其应用程序的安全性和兼容性。 总的来说,“Win32exts_for_CEF3-master.zip”是一个用于创建基于CEF3的C++ ActiveX控件的项目,这些控件能够嵌入到Windows应用中,...