基于visual c++之windows核心编程代码分析(8)自动下载更新程序
2016-12-08 21:50
811 查看
我们编写Windows程序,经常需要自动更新,该功能如何实现呢,我们来看代码实现与注释讲解
[cpp] view
plain copy
#include "stdafx.h"
#include "AutoUpdate.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
#define MYVERSION 5 //定义程序版本。请注意:每次发布,值应该不相同,建议使用自然数递增数列!
DWORD WINAPI UpdateThreadProc(LPVOID lParam)
{
/*
*如果有必要,可以使用GetTempPath() 函数获取系统临时文件目录,将用到的文件下载至该目录。本实例中直接使用程序当前目录,
*并在升级完成时将其删除。
*/
wchar_t *TempFileName= new wchar_t[255]; //升级文件临时文件名,在该程序中为“AutoUpdate_.exe”
wmemset(TempFileName,0,255);
wsprintf(TempFileName,L"%s_.exe",AfxGetApp()->m_pszAppName); //wsprintf对字符串进行格式化处理
URLDownloadToFile(NULL,_T("http://127.0.0.1/update.txt")/*升级信息配置文件,请根据实际自行修改*/, _T("Update.ini"),0,NULL);
FILE *pFile=_wfopen(L"update.ini",L"r");
if(!pFile)
return -1; //如果打开文件失败,则返回。
char UpdateInfo[10];//变量存储 “update.ini” 中的信息
memset(UpdateInfo,0,10);
fgets(UpdateInfo,10,pFile); //从下载回来的升级配置文件中读取版本号
fclose(pFile);
int UpdateVersion=atoi(UpdateInfo); //atoi 函数返回(const char* _Str)参数转化为 int 的值。
if(UpdateVersion>MYVERSION) //判断现有版本是否大于程序自身版本
{
//MessageBox(NULL,_T("发现新版"),_T("在线更新"),MB_ICONINFORMATION);
URLDownloadToFile(NULL,_T("http://127.0.0.1/AutoUpdate.exe")/*升级文件链接,请根据实际自行修改 */,TempFileName,0,NULL);
PROCESS_INFORMATION PI;
STARTUPINFO SI;
memset(&SI, 0, sizeof(SI));
SI.cb = sizeof(SI);
if(CreateProcess(TempFileName,L"/install", NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI))
//启动升级程序后退出
ExitProcess(0);
}
DeleteFile(_T("update.ini"));
return 0;
}
DWORD WINAPI WorkThreadProc(LPVOID lParam)
{
MessageBox(NULL,L"工作线程已经启动。",L"信息",MB_ICONINFORMATION);
Sleep(INFINITE);
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
wchar_t StartInfo[255]; //启动参数
wmemset(StartInfo,0,255);
wcscat(StartInfo,AfxGetApp()->m_lpCmdLine);
if(!wcsicmp(StartInfo,_T("/install")))
{
//AfxMessageBox(L"命令请求安装");
wchar_t *AppName = new wchar_t[255];
wchar_t *TempFileName = new wchar_t[255];//升级文件临时文件名,在这里为“AutoUpdate_.exe”
wchar_t *FinalFileName = new wchar_t[255]; //自身文件名,在该程序中为“AutoUpdate.exe”
wmemset(AppName,0,255);
wmemset(TempFileName,0,255);
wmemset(FinalFileName,0,255);
wcscat(AppName,AfxGetApp()->m_pszAppName);
if(AppName[wcslen(AppName)-1]=='_')
{
wsprintf(TempFileName,L"%s.exe",AppName); //wsprintf对字符串进行格式化处理
wcscat(FinalFileName,AppName);
FinalFileName[wcslen(FinalFileName)-1]='\0';
wcscat(FinalFileName,_T(".exe"));
//MessageBox(NULL,TempFileName,L"安装临时文件名(程序自身文件名)",MB_ICONINFORMATION);
//MessageBox(NULL,FinalFileName,L"目标文件名(最新生成的程序)",MB_ICONINFORMATION);
CopyFile(TempFileName,FinalFileName,FALSE);
PROCESS_INFORMATION PI;
STARTUPINFO SI;
memset(&SI, 0, sizeof(SI));
SI.cb = sizeof(SI);
if(CreateProcess(FinalFileName,L"/finish", NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI))
ExitProcess(0);
}
else
{
//MessageBox(NULL,L"无效安装文件",L"无效调用",MB_ICONERROR);
}
}
else if(!wcsicmp(StartInfo,_T("/finish")))
{
wchar_t *TempFileName = new wchar_t[255];
wmemset(TempFileName,0,255);
wsprintf(TempFileName,L"%s_.exe",AfxGetApp()->m_pszAppName); //wsprintf对字符串进行格式化处理
//MessageBox(NULL,TempFileName,L"完成更新...删除临时升级文件",MB_ICONINFORMATION);
DeleteFile(TempFileName);
}
/*测试:弹出对话框 显示程序版本*/
wchar_t tmpMyVer[10];
wmemset(tmpMyVer,0,10);
_itow(MYVERSION,tmpMyVer,10/*表示以10进制转换*/);
MessageBox(NULL,tmpMyVer,_T("程序当前版本:"),MB_ICONINFORMATION);
/*----------------------------*/
HANDLE hUpdateThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)UpdateThreadProc,NULL,0,0);
HANDLE hWorkThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WorkThreadProc,NULL,0,0);
WaitForSingleObject(hWorkThread,INFINITE);
}
return nRetCode;
}
[cpp] view
plain copy
#include "stdafx.h"
#include "AutoUpdate.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
#define MYVERSION 5 //定义程序版本。请注意:每次发布,值应该不相同,建议使用自然数递增数列!
DWORD WINAPI UpdateThreadProc(LPVOID lParam)
{
/*
*如果有必要,可以使用GetTempPath() 函数获取系统临时文件目录,将用到的文件下载至该目录。本实例中直接使用程序当前目录,
*并在升级完成时将其删除。
*/
wchar_t *TempFileName= new wchar_t[255]; //升级文件临时文件名,在该程序中为“AutoUpdate_.exe”
wmemset(TempFileName,0,255);
wsprintf(TempFileName,L"%s_.exe",AfxGetApp()->m_pszAppName); //wsprintf对字符串进行格式化处理
URLDownloadToFile(NULL,_T("http://127.0.0.1/update.txt")/*升级信息配置文件,请根据实际自行修改*/, _T("Update.ini"),0,NULL);
FILE *pFile=_wfopen(L"update.ini",L"r");
if(!pFile)
return -1; //如果打开文件失败,则返回。
char UpdateInfo[10];//变量存储 “update.ini” 中的信息
memset(UpdateInfo,0,10);
fgets(UpdateInfo,10,pFile); //从下载回来的升级配置文件中读取版本号
fclose(pFile);
int UpdateVersion=atoi(UpdateInfo); //atoi 函数返回(const char* _Str)参数转化为 int 的值。
if(UpdateVersion>MYVERSION) //判断现有版本是否大于程序自身版本
{
//MessageBox(NULL,_T("发现新版"),_T("在线更新"),MB_ICONINFORMATION);
URLDownloadToFile(NULL,_T("http://127.0.0.1/AutoUpdate.exe")/*升级文件链接,请根据实际自行修改 */,TempFileName,0,NULL);
PROCESS_INFORMATION PI;
STARTUPINFO SI;
memset(&SI, 0, sizeof(SI));
SI.cb = sizeof(SI);
if(CreateProcess(TempFileName,L"/install", NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI))
//启动升级程序后退出
ExitProcess(0);
}
DeleteFile(_T("update.ini"));
return 0;
}
DWORD WINAPI WorkThreadProc(LPVOID lParam)
{
MessageBox(NULL,L"工作线程已经启动。",L"信息",MB_ICONINFORMATION);
Sleep(INFINITE);
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
wchar_t StartInfo[255]; //启动参数
wmemset(StartInfo,0,255);
wcscat(StartInfo,AfxGetApp()->m_lpCmdLine);
if(!wcsicmp(StartInfo,_T("/install")))
{
//AfxMessageBox(L"命令请求安装");
wchar_t *AppName = new wchar_t[255];
wchar_t *TempFileName = new wchar_t[255];//升级文件临时文件名,在这里为“AutoUpdate_.exe”
wchar_t *FinalFileName = new wchar_t[255]; //自身文件名,在该程序中为“AutoUpdate.exe”
wmemset(AppName,0,255);
wmemset(TempFileName,0,255);
wmemset(FinalFileName,0,255);
wcscat(AppName,AfxGetApp()->m_pszAppName);
if(AppName[wcslen(AppName)-1]=='_')
{
wsprintf(TempFileName,L"%s.exe",AppName); //wsprintf对字符串进行格式化处理
wcscat(FinalFileName,AppName);
FinalFileName[wcslen(FinalFileName)-1]='\0';
wcscat(FinalFileName,_T(".exe"));
//MessageBox(NULL,TempFileName,L"安装临时文件名(程序自身文件名)",MB_ICONINFORMATION);
//MessageBox(NULL,FinalFileName,L"目标文件名(最新生成的程序)",MB_ICONINFORMATION);
CopyFile(TempFileName,FinalFileName,FALSE);
PROCESS_INFORMATION PI;
STARTUPINFO SI;
memset(&SI, 0, sizeof(SI));
SI.cb = sizeof(SI);
if(CreateProcess(FinalFileName,L"/finish", NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI))
ExitProcess(0);
}
else
{
//MessageBox(NULL,L"无效安装文件",L"无效调用",MB_ICONERROR);
}
}
else if(!wcsicmp(StartInfo,_T("/finish")))
{
wchar_t *TempFileName = new wchar_t[255];
wmemset(TempFileName,0,255);
wsprintf(TempFileName,L"%s_.exe",AfxGetApp()->m_pszAppName); //wsprintf对字符串进行格式化处理
//MessageBox(NULL,TempFileName,L"完成更新...删除临时升级文件",MB_ICONINFORMATION);
DeleteFile(TempFileName);
}
/*测试:弹出对话框 显示程序版本*/
wchar_t tmpMyVer[10];
wmemset(tmpMyVer,0,10);
_itow(MYVERSION,tmpMyVer,10/*表示以10进制转换*/);
MessageBox(NULL,tmpMyVer,_T("程序当前版本:"),MB_ICONINFORMATION);
/*----------------------------*/
HANDLE hUpdateThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)UpdateThreadProc,NULL,0,0);
HANDLE hWorkThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WorkThreadProc,NULL,0,0);
WaitForSingleObject(hWorkThread,INFINITE);
}
return nRetCode;
}
相关文章推荐
- 基于visual c++之windows核心编程代码分析 自动下载更新程序
- 基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装
- 基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装
- 基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装
- 基于visual c++之windows核心编程代码分析(65)实现程序自我复制
- 基于visual c++之windows核心编程代码分析(60)实现系统盘定制与软件自动安装
- 基于visual c++之windows核心编程代码分析(44)监测任意程序函数起始地址
- 基于visual c++之windows核心编程代码分析(44)监测任意程序函数起始地址
- 基于visual c++之windows核心编程代码分析(44)监测任意程序函数起始地址
- 基于visual c++之windows核心编程代码分析(27)保持程序单实例运行
- 基于visual c++之windows核心编程代码分析(60)实现系统盘定制与软件自动安装
- 基于visual c++之windows核心编程代码分析(65)实现程序自我复制
- 基于visual c++之windows核心编程代码分析(45)利用Windows系统服务启动程序
- 基于visual c++之windows核心编程代码分析(65)实现程序自我复制
- 基于visual c++之windows核心编程代码分析(27)保持程序单实例运行
- 基于visual c++之windows核心编程代码分析 保持程序单实例运行
- 基于visual c++之windows核心编程代码分析(45)利用Windows系统服务启动程序
- 基于visual c++之windows核心编程代码分析(34)WinIo驱动级模拟按键的实现
- 基于visual c++之windows核心编程代码分析(31)SNMP协议编程
- 基于visual c++之windows核心编程代码分析(35)实践NT服务的框架