基于visual c++之windows核心编程代码分析(8)自动下载更新程序

我们编写Windows程序,经常需要自动更新,该功能如何实现呢,我们来看代码实现与注释讲解

 

 

#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;
}


 

你可能感兴趣的:(编程,C++,windows,null,代码分析,winapi)