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

来源:互联网 发布:vscode github 编辑:程序博客网 时间:2024/05/17 08:42

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

 

 

[cpp] view plain copy
  1. #include "stdafx.h"  
  2. #include "AutoUpdate.h"  
  3.   
  4. #ifdef _DEBUG  
  5. #define new DEBUG_NEW  
  6. #endif  
  7.   
  8. // 唯一的应用程序对象  
  9.   
  10. CWinApp theApp;  
  11.   
  12. using namespace std;  
  13.   
  14. #define MYVERSION                      5    //定义程序版本。请注意:每次发布,值应该不相同,建议使用自然数递增数列!  
  15.   
  16. DWORD WINAPI UpdateThreadProc(LPVOID lParam)  
  17. {  
  18.     /* 
  19.     *如果有必要,可以使用GetTempPath() 函数获取系统临时文件目录,将用到的文件下载至该目录。本实例中直接使用程序当前目录, 
  20.     *并在升级完成时将其删除。 
  21.     */  
  22.     wchar_t *TempFileName= new wchar_t[255];    //升级文件临时文件名,在该程序中为“AutoUpdate_.exe”  
  23.     wmemset(TempFileName,0,255);  
  24.     wsprintf(TempFileName,L"%s_.exe",AfxGetApp()->m_pszAppName); //wsprintf对字符串进行格式化处理  
  25.   
  26.     URLDownloadToFile(NULL,_T("http://127.0.0.1/update.txt")/*升级信息配置文件,请根据实际自行修改*/, _T("Update.ini"),0,NULL);   
  27.   
  28.     FILE *pFile=_wfopen(L"update.ini",L"r");  
  29.     if(!pFile)  
  30.         return -1;  //如果打开文件失败,则返回。  
  31.   
  32.     char UpdateInfo[10];//变量存储 “update.ini” 中的信息  
  33.     memset(UpdateInfo,0,10);  
  34.     fgets(UpdateInfo,10,pFile); //从下载回来的升级配置文件中读取版本号  
  35.     fclose(pFile);  
  36.   
  37.     int UpdateVersion=atoi(UpdateInfo); //atoi 函数返回(const char* _Str)参数转化为 int 的值。  
  38.   
  39.     if(UpdateVersion>MYVERSION)  //判断现有版本是否大于程序自身版本  
  40.     {  
  41.         //MessageBox(NULL,_T("发现新版"),_T("在线更新"),MB_ICONINFORMATION);  
  42.         URLDownloadToFile(NULL,_T("http://127.0.0.1/AutoUpdate.exe")/*升级文件链接,请根据实际自行修改 */,TempFileName,0,NULL);  
  43.   
  44.         PROCESS_INFORMATION PI;  
  45.         STARTUPINFO SI;  
  46.         memset(&SI, 0, sizeof(SI));  
  47.         SI.cb = sizeof(SI);  
  48.         if(CreateProcess(TempFileName,L"/install", NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI))  
  49.             //启动升级程序后退出  
  50.             ExitProcess(0);  
  51.     }  
  52.     DeleteFile(_T("update.ini"));     
  53.     return 0;  
  54. }  
  55. DWORD WINAPI WorkThreadProc(LPVOID lParam)  
  56. {  
  57.     MessageBox(NULL,L"工作线程已经启动。",L"信息",MB_ICONINFORMATION);  
  58.     Sleep(INFINITE);  
  59.     return 0;  
  60. }  
  61. int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])  
  62. {  
  63.     int nRetCode = 0;  
  64.   
  65.     // 初始化 MFC 并在失败时显示错误  
  66.     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))  
  67.     {  
  68.         // TODO: 更改错误代码以符合您的需要  
  69.         _tprintf(_T("错误: MFC 初始化失败\n"));  
  70.         nRetCode = 1;  
  71.     }  
  72.     else  
  73.     {  
  74.         // TODO: 在此处为应用程序的行为编写代码。  
  75.   
  76.         wchar_t StartInfo[255]; //启动参数  
  77.         wmemset(StartInfo,0,255);  
  78.         wcscat(StartInfo,AfxGetApp()->m_lpCmdLine);  
  79.   
  80.         if(!wcsicmp(StartInfo,_T("/install")))  
  81.         {  
  82.             //AfxMessageBox(L"命令请求安装");  
  83.             wchar_t *AppName        = new wchar_t[255];  
  84.             wchar_t *TempFileName       = new wchar_t[255];//升级文件临时文件名,在这里为“AutoUpdate_.exe”  
  85.             wchar_t *FinalFileName = new wchar_t[255];  //自身文件名,在该程序中为“AutoUpdate.exe”  
  86.   
  87.             wmemset(AppName,0,255);  
  88.             wmemset(TempFileName,0,255);  
  89.             wmemset(FinalFileName,0,255);  
  90.   
  91.             wcscat(AppName,AfxGetApp()->m_pszAppName);  
  92.   
  93.             if(AppName[wcslen(AppName)-1]=='_')  
  94.             {  
  95.   
  96.                 wsprintf(TempFileName,L"%s.exe",AppName); //wsprintf对字符串进行格式化处理  
  97.   
  98.                 wcscat(FinalFileName,AppName);  
  99.                 FinalFileName[wcslen(FinalFileName)-1]='\0';  
  100.                 wcscat(FinalFileName,_T(".exe"));  
  101.   
  102.                 //MessageBox(NULL,TempFileName,L"安装临时文件名(程序自身文件名)",MB_ICONINFORMATION);  
  103.                 //MessageBox(NULL,FinalFileName,L"目标文件名(最新生成的程序)",MB_ICONINFORMATION);  
  104.                 CopyFile(TempFileName,FinalFileName,FALSE);  
  105.   
  106.                 PROCESS_INFORMATION PI;  
  107.                 STARTUPINFO SI;  
  108.                 memset(&SI, 0, sizeof(SI));  
  109.                 SI.cb = sizeof(SI);  
  110.                 if(CreateProcess(FinalFileName,L"/finish", NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI))  
  111.                     ExitProcess(0);  
  112.   
  113.             }  
  114.             else  
  115.             {  
  116.                 //MessageBox(NULL,L"无效安装文件",L"无效调用",MB_ICONERROR);  
  117.             }  
  118.         }  
  119.         else if(!wcsicmp(StartInfo,_T("/finish")))  
  120.         {  
  121.             wchar_t *TempFileName   = new wchar_t[255];  
  122.             wmemset(TempFileName,0,255);  
  123.             wsprintf(TempFileName,L"%s_.exe",AfxGetApp()->m_pszAppName); //wsprintf对字符串进行格式化处理  
  124.             //MessageBox(NULL,TempFileName,L"完成更新...删除临时升级文件",MB_ICONINFORMATION);  
  125.             DeleteFile(TempFileName);  
  126.         }  
  127.   
  128.         /*测试:弹出对话框 显示程序版本*/  
  129.         wchar_t tmpMyVer[10];  
  130.         wmemset(tmpMyVer,0,10);  
  131.         _itow(MYVERSION,tmpMyVer,10/*表示以10进制转换*/);  
  132.         MessageBox(NULL,tmpMyVer,_T("程序当前版本:"),MB_ICONINFORMATION);  
  133.         /*----------------------------*/  
  134.   
  135.         HANDLE hUpdateThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)UpdateThreadProc,NULL,0,0);  
  136.   
  137.         HANDLE hWorkThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WorkThreadProc,NULL,0,0);  
  138.         WaitForSingleObject(hWorkThread,INFINITE);  
  139.     }  
  140.   
  141.     return nRetCode;  
  142. }  
0 0
原创粉丝点击