前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于visual c++之windows核心编程代码分析(8)自动下载更新程序

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

作者头像
用户7886150
修改2021-02-19 15:41:20
5480
修改2021-02-19 15:41:20
举报
文章被收录于专栏:bit哲学院

参考链接: C++ wcscat()

我们编写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;

}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档