您的位置:首页 > 编程语言 > C语言/C++

基于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;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐