读取MFC资源中的版本信息

起因

  记得刚接触MFC的时候就发现在资源部分有一个Version的东西,当时由于刚刚入门,写些程序都是有的没的,所以也没有很关注版本之类的东西。现在使用SVN维护程序还是挺方便的,但是慢慢发现了由于有的时候版本更新的较快,发给客户的程序他们也不知道是什么版本,这样一出错就比较糗了,无从着手,所以开始注意这个项,本以为这个Version可以象字符表一样方便使用,结果还是挺麻烦的。

实现

  还是查阅相关的MSDN之类,以及一些论坛,终于找到了方法。我的设计是这样的,在关于对话框的标题上标识下一个版本号(原有系统的版本号是美工直接嵌入到图像中的,现在美工转走了。。。),该版本号可以与SVN中的更新号相关联,这样用户只要给我一个关于框的截图,我就可以找到对应版本的源码,方便调试。

BOOL CAboutDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    /* 获得程序路径 */
    WCHAR l_wcaAppPath[MAX_PATH];//保存应用程序路径 
    ::GetModuleFileName(NULL, l_wcaAppPath, MAX_PATH);   

    /* 获得版本信息大小 */
    UINT l_uiVersionInfoSize;//保存版本信息总体的大小
    TCHAR * l_ptcVersionInfo;   
    l_uiVersionInfoSize = ::GetFileVersionInfoSize(l_wcaAppPath, 0);//获得大小 
    l_ptcVersionInfo = new TCHAR[l_uiVersionInfoSize];//申请空间  

    /* 该结构用于获得版本信息的语言信息 */
    struct VersionLanguage
    {
        WORD m_wLanguage;
        WORD m_wCcodePage;
    };

    VersionLanguage * l_ptVersionLanguage;
    UINT l_uiSize;

    if (::GetFileVersionInfo(l_wcaAppPath, 0, l_uiVersionInfoSize, l_ptcVersionInfo) != 0)//获取版本信息 
    { 
        
        if (::VerQueryValue(l_ptcVersionInfo,_T("\\VarFileInfo\\Translation"),reinterpret_cast<LPVOID*>(&l_ptVersionLanguage),&l_uiSize))//查询语言信息并保存
        {       
            /* 生成查询信息格式符 */
            CString l_cstrSubBlock;
            l_cstrSubBlock.Format(_T("\\StringFileInfo\\%04x%04x\\ProductVersion"),l_ptVersionLanguage->m_wLanguage,l_ptVersionLanguage->m_wCcodePage);

            LPVOID * l_pvResult;

            /* 查询指定信息 */
            if(::VerQueryValue(static_cast<LPVOID>(l_ptcVersionInfo),l_cstrSubBlock.GetBuffer(),reinterpret_cast<LPVOID*>(&l_pvResult),&l_uiSize))
            {
                CString l_cstrProductVersion(reinterpret_cast<TCHAR *>(l_pvResult));//获得版本信息

                /* 将版本信息加入到标题栏 */
                CString l_cstrCaption;
                GetWindowText(l_cstrCaption);
                l_cstrCaption += _T(" ") + l_cstrProductVersion;
                SetWindowText(l_cstrCaption);
            }

        }   
    }

    delete [] l_ptcVersionInfo;    
    
    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}

  可以看到核心代码的过程就是首先获得版本信息的全部数据,保存在l_ptcVersionInfo这个量中,但是具体的信息怎们取就序号获得相应的偏移值才可以了,核心的还是是VerQueryValue这个函数,第一个参数是已获得版本信息,应该是计算其中的偏移使用,第二个参数很重要,具体来说有三种格式,具体可以加MSDN:http://msdn.microsoft.com/zh-cn/subscriptions/downloads/aa909243.aspx,分别对应了一个包含信息的结构体和获得语言及指定语言的若干信息等,第一种参数比较简单,所以功能好像也不是很完全,和MFC的资源好像并没有对应的关系,所以我使用的是第二种加第三种,这两种一般是要一起使用的。

  通过第一次调用VerQueryValue这个函数可以获得MFC中Version中标志为Blocker Header的项,然后根据此项构造参数,再次调用VerQueryValue就可以获得指定的信息,后面只需要将其在标题栏末端显示出来就好了。

总结

  这个问题感觉解决的还是可以,但是其实使用上还是有一定的问题,就是每次提交SVN的时候都需要对资源进行更改,这就比较麻烦了,如果忘记的话,为了保持同步还需要额外提交一个只变更资源的更新,太过于山寨,感觉SVN应该有自身的更新机制可以定制脚本完成这方面的工作,但是自己还仅仅是会用而已,暂时没有接触到这种功能,学习还是无止境啊。

转载于:https://www.cnblogs.com/geminiv/archive/2012/10/24/2737288.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC (Microsoft Foundation Class) 是微软提供的一组应用程序框架,其可以帮助程序员快速开发 Microsoft Windows 平台下的应用程序。其,自动更新资源MFC 一个重要功能,其可以帮助软件自动升级,并更新最新的版本信息。 在 MFC 使用自动更新资源需要经过以下步骤: 首先,需要在资源文件定义自动更新资源相关的信息,例如版本信息、下载地址等等。然后,在应用程序初始化时,可以调用函数 EnableVersionCheck() 来启用自动更新资源的功能。在应用程序运行过程MFC 将会自动检测服务器上的最新版本,并提示用户是否需要升级。如果用户同意升级,MFC 将会自动下载最新的程序,并安装升级。 如果需要在自动更新资源更新版本信息,可以通过以下步骤实现: 1. 修改资源文件的版本号,例如修改 VERTIONINFO 的 FILEVERSION 和 PRODUCTVERSION 字段。 2. 在应用程序调用函数 AfxSetResourceHandle() 来指定使用的资源句柄。 3. 调用函数 AfxLoadLibrary() 来动态加载 DLL,以便更新程序版本信息。 4. 使用函数 UpdateResource() 来修改版本资源的信息,例如修改版本号、文件描述等等。 5. 最后,调用函数 FreeLibrary() 来卸载 DLL 文件。 以上就是在 MFC 自动更新资源更新版本信息的方法。需要注意的是,为了确保自动更新资源的可靠性和安全性,程序员需要保证下载的程序经过验证,并进行合理的安全措施。 ### 回答2: 在MFC,实现自动更新资源版本信息可以通过以下步骤: 1. 在工程资源添加版本信息,包括文件版本、产品版本等各种版本属性。 2. 在代码使用CWinApp类的GetAppVersion函数来获取当前程序版本信息。 3. 在自动更新程序,通过读取从服务器上下载下来的版本信息文件,获取最新的版本信息。 4. 对比本地程序和最新版本的版本信息,如果本地程序版本较旧,则提示用户是否更新程序。 5. 如果用户确认要更新程序,先备份原程序文件,然后下载最新版本的程序文件,并替换原程序文件。 6. 更新完成后,再次运行程序时,就可以使用新的版本信息了。 需要注意的是,自动更新程序需要有足够的权限来替换原程序文件,否则更新过程可能会受到阻碍。同时还需要保证服务器上的版本信息文件和可执行程序版本信息一一对应,否则可能会出现版本不兼容的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值