现在的位置: 首页 > 综合 > 正文

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

2013年08月27日 ⁄ 综合 ⁄ 共 3536字 ⁄ 字号 评论关闭

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

  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, 

抱歉!评论已关闭.