最新文章
热门文章
新华字典词典2009注册码序列号破 
使用VC自己动手编写加壳程序(1)— 
黑鹰VIP破解视频教程(好东西) 
使用VC自己动手编写加壳程序(3)— 
使用VC自己动手编写加壳程序(5)— 
使用VC自己动手编写加壳程序(6)— 
使用VC自己动手编写加壳程序(4)— 
使用VC自己动手编写加壳程序(2)— 
天草破解班视频教程 初级中级高级 
ASPack 2.001 -> Alexey Solodov 
当前位置:李露的博客 >> 黑客学堂 >> 浏览文章
[Begin09PE]第25课 打造自己的更新检测功能
更新日期:2010年01月01日  来源:本站原创  作者:天漏客   访问次数:次  【字体:

主要内容:
创建MFC线程
获取文件版本信息

源码:

 下载信息  [文件大小:400.68 KB 下载次数: 次]
点击下载文件:Begin09PEInfo_25

 




=============================================================================

主要分两步。第一是获取自身的版本信息;第二是获取现在最新的版本信息。
获取自身版本信息,在软件中获取。获取最新的软件版本信息,则要借助于网络了。从网络上获取版本数据。最后,检测到更新后,更不更新就要看用户的选择了。

第一步,获取自身的版本信息。
第一种方法。简单的方式,在程序中定义一个全局的宏或者字符串常量,表示版本号。程序就可以直接使用了。保持这个值与资源文件中的版本资源一致就最好了。
第二种方式。代码获取,也是我们要使用的方式。

首先考虑一个问题,我们的版本检测放到哪?
我们可以放到软件启动时,创建一个新的线程用来检测更新。

在CBegin09PEInfoApp中添加成员函数,用来检测更新。
BOOL CBegin09PEInfoApp::CheckUpdate()

添加线程函数,在线程中运行更新检测。
申明:static UINT ThreadUpdate(LPVOID lParam);
定义:UINT CBegin09PEInfoApp::ThreadUpdate(LPVOID lParam)
注意要是静态类成员函数。

调用。在CBegin09PEInfoDlg对话框DoModal()显示之前。
    //调用检测更新
    CheckUpdate();

完善代码。
BOOL CBegin09PEInfoApp::CheckUpdate()
{
    //创建检测更新线程
    AfxBeginThread(ThreadUpdate,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
    return TRUE;
}

获取当前版本信息
BOOL CBegin09PEInfoApp::GetFileVerInfo(DWORD &dwMajVer, DWORD &dwMinVer)
{
    //下面是获取自己的版本信息
    DWORD    dwHandle = 0;
    DWORD    dwInfoSize = 0;
    TCHAR    tzFilePath[MAX_PATH] = {0};
    char    *pVerInfoBuff = NULL;
    
    //获取本程序文件路径
    GetModuleFileName(NULL,tzFilePath,MAX_PATH);
    
    //分配内存,获取版本数据
    dwInfoSize = GetFileVersionInfoSize(tzFilePath,&dwHandle);
    pVerInfoBuff = new char[dwInfoSize];
    memset(pVerInfoBuff,0,dwInfoSize);
    GetFileVersionInfo(tzFilePath,dwHandle,dwInfoSize,pVerInfoBuff);
    
    //查询固定版本数据,
    VS_FIXEDFILEINFO    *pvsFixedInfo = NULL;
    UINT                dwSizeFixed = sizeof(VS_FIXEDFILEINFO);
    VerQueryValue(pVerInfoBuff,TEXT("\\"),(LPVOID*)&pvsFixedInfo,&dwSizeFixed);
    
    //版本数据
    dwMajVer = pvsFixedInfo->dwProductVersionMS;
    dwMinVer = pvsFixedInfo->dwProductVersionLS;

    //删除缓存
    delete []pVerInfoBuff;
    pVerInfoBuff = NULL;
    
    return TRUE;
}

线程函数。
UINT CBegin09PEInfoApp::ThreadUpdate(LPVOID lParam)
{
    //转换参数
    CBegin09PEInfoApp *pApp = (CBegin09PEInfoApp*)lParam;
    if (pApp == NULL)
    {
        return 0;
    }
    BOOL    bRetCode = FALSE;
    //定义两个版本信息数据
    CString    strVerSelf;    //当前版本
    CString    strVerNew;    //新版本字符串
    CString    strMsg;        //版本更新对话框

    //定义版本值
    DWORD    dwMajVerSelf = 0;
    DWORD    dwMonVerSelf = 0;
    DWORD    dwMajVerNew    = 0;
    DWORD    dwMinVerNew = 0;

    //获取自己版本信息
    bRetCode = pApp->GetFileVerInfo(dwMajVerSelf,dwMonVerSelf);
    if (!bRetCode)
    {
        MessageBox(NULL,_T("获取本地版本信息失败,无法更新!"),_T("错误!"),MB_OK);
        return 0;
    }
    //格式化当前产品版本数据
    strVerSelf.Format(_T("%08X%08X"),dwMajVerSelf,dwMonVerSelf);

    //////////////////////////////////////////////////////////////////////////
    //获取网络上更新的版本信息
    bRetCode = pApp->GetUpdateInfoFromServer(dwMajVerNew,dwMinVerNew,strMsg);
    if (!bRetCode)
    {
        MessageBox(NULL,strMsg,_T("错误!"),MB_OK);
        return 0;
    }
    strVerNew.Format(_T("%08X%08X"),dwMajVerNew,dwMinVerNew);
    //////////////////////////////////////////////////////////////////////////

    //判断版本是否更新
    if (strVerNew > strVerSelf)
    {
        //格式化获取的版本字符串
        strMsg.Format(_T("Begin09PEInfo发现了更新版本!\r\n当前版本:%d.%d.%d.%d\r\n\
最新版本:%d.%d.%d.%d\r\n\r\n是否现在打开更新版网页?"),
            HIWORD(dwMajVerSelf),LOWORD(dwMajVerSelf),
            HIWORD(dwMonVerSelf),LOWORD(dwMonVerSelf),
            HIWORD(dwMajVerNew),LOWORD(dwMajVerNew),
            HIWORD(dwMinVerNew),LOWORD(dwMinVerNew)
            );
        if (IDOK == MessageBox(NULL,strMsg,_T("Begin09PEInfo更新提示"),MB_OKCANCEL))
        {
            //打开更新网页
            ShellExecute(NULL,_T("open"),_T("/Html/heikexuetang/Begin09PEInfo.htm"),NULL,NULL,SW_SHOW);
        }

    }
    else
    {
        //如果显示没有更新信息
        if (pApp->m_bShowNoUpdate)
        {
            MessageBox(NULL,_T("当前软件已是最新版本,无需更新!"),_T("提示"),MB_OK);
        }
    }


    return 0;
}

发表评论】【告诉好友】【打印此文】【收藏此文】【关闭窗口
上一篇:[Begin09PE]第24课 解决输入表崩溃问题 下一篇:[Begin09PE]第26课 打造自己的更新检测功能(下)(课程完结)

Copyright 2006-2012 Powered by LiLu.NAME,李露的博客 All Rights Reserved.
E-Mail:lilu.name#gamil.com(注意是gmail,自己改) QQ:285252760
苏ICP备08016526号