基于visual c++之windows核心编程代码分析(8)自动下载更新程序
来源:互联网 发布:vscode github 编辑:程序博客网 时间:2024/05/17 08:42
我们编写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)
- {
-
-
-
-
- wchar_t *TempFileName= new wchar_t[255];
- wmemset(TempFileName,0,255);
- wsprintf(TempFileName,L"%s_.exe",AfxGetApp()->m_pszAppName);
-
- 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];
- memset(UpdateInfo,0,10);
- fgets(UpdateInfo,10,pFile);
- fclose(pFile);
-
- int UpdateVersion=atoi(UpdateInfo);
-
- if(UpdateVersion>MYVERSION)
- {
-
- 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;
-
-
- if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
- {
-
- _tprintf(_T("错误: MFC 初始化失败\n"));
- nRetCode = 1;
- }
- else
- {
-
-
- wchar_t StartInfo[255];
- wmemset(StartInfo,0,255);
- wcscat(StartInfo,AfxGetApp()->m_lpCmdLine);
-
- if(!wcsicmp(StartInfo,_T("/install")))
- {
-
- wchar_t *AppName = new wchar_t[255];
- wchar_t *TempFileName = new wchar_t[255];
- wchar_t *FinalFileName = new wchar_t[255];
-
- 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);
-
- wcscat(FinalFileName,AppName);
- FinalFileName[wcslen(FinalFileName)-1]='\0';
- wcscat(FinalFileName,_T(".exe"));
-
-
-
- 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
- {
-
- }
- }
- 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);
-
- DeleteFile(TempFileName);
- }
-
-
- wchar_t tmpMyVer[10];
- wmemset(tmpMyVer,0,10);
- _itow(MYVERSION,tmpMyVer,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;
- }
0 0