Win32 程序添加并获取版本号

举报
福州司马懿 发表于 2022/11/20 13:16:32 2022/11/20
【摘要】 打出的 Release 包在项目右键,点击生成,或点击VS上面绿色三角形按钮,会生成当前项目的exe程序exe程序的输出路径,在底部的“输出对话框”中找到这个位置,随便右击一个exe程序,选择属性然后切换到详细信息选项卡,可以发现,默认情况下,并不会带上版本号 为exe程序添加版本号在“解决方案资源管理器”面板中,切换到“资源视图”右击项目,添加资源在弹出的对话框中,选择version,点...

打出的 Release 包

在项目右键,点击生成,或点击VS上面绿色三角形按钮,会生成当前项目的exe程序

图片.png
图片.png

exe程序的输出路径,在底部的“输出对话框”中

图片.png

找到这个位置,随便右击一个exe程序,选择属性
图片.png

然后切换到详细信息选项卡,可以发现,默认情况下,并不会带上版本号
图片.png

为exe程序添加版本号

在“解决方案资源管理器”面板中,切换到“资源视图”
图片.png

右击项目,添加资源
图片.png

在弹出的对话框中,选择version,点击“新建”按钮,将version添加进项目
图片.png

图片.png

右键项目,点击生成,再次查看,可以发现版本号已经出现了
图片.png

各个版本号的区别

可以看到,版本号总共有4个

  • FILEVERSION
  • PRODUCTVERSION
  • FileVersion
  • ProductVersion

理论上,4个版本号应该设为一致,但如果不一致,会显示出哪个版本号呢,让我们来试验一下。首先,修改版本号如下

图片.png

生成exe,并打开其属性,可以看到,最终生效的是FILEVERSIONFILEVERSION
图片.png

注意:经过测试发现:在rc文件上,修改FILEVERSION后,FileVersion会被同步修改;修改PRODUCTVERSION后,ProductVersion也会被同步修改。反之则不会发送改变

使用代码获取文件版本号

首先需要引入头文件

#include <string>
#pragma comment(lib, "version.lib")
using namespace std;

获取文件版本的代码如下

string GetFileVersion(LPCSTR filePath) {
    //MyLog& mLog = MyLog::GetInstance();
    string ver;
    DWORD dwHandle = 0;
    int verInfoSize = GetFileVersionInfoSizeA(filePath, &dwHandle);
    if (verInfoSize != 0)
    {
        char* pBuf = new char[verInfoSize];
        //从支持版本标记的一个模块里获取文件版本信息,pBuf缓冲区用于装载文件的版本信息
        if (GetFileVersionInfoA(filePath, 0, verInfoSize, pBuf))
        {
            //文件版本信息包含在结构体VS_FIXEDFILEINFO中
            //DWORD dwSignature; //包含的值是0xFEEF04BD 
            //DWORD dwStrucVersion; //该结构的32位二进制版本号,高16位是主版本号,低16位是副版本号 (固定65536) 
            //DWORD dwFileVersionMS; //该文件二进制版本号的高32bits 
            //DWORD dwFileVersionLS; //该文件二进制版本号的低32bits
            //DWORD dwProductVersionMS; //发布该文件的产品二进制版本号高32bits 
            //DWORD dwProductVersionLS; //发布该文件的产品二进制版本号低32bits 
            //DWORD dwFileDateMS; //二进制文件创建日期和时间戳的高32bits
            //DWORD dwFileDateLS; //二进制文件创建日期和时间戳的低32bits 
            VS_FIXEDFILEINFO* pVsInfo;
            UINT fileInfoSize = sizeof(VS_FIXEDFILEINFO);
            //从版本资源中获取信息
            if (VerQueryValue(pBuf, _T("\\"), (void**)&pVsInfo, &fileInfoSize))
            {
                //HIWORD是取高16位,LOWORD是取低16位
                sprintf_s(pBuf, verInfoSize, "%d.%d.%d.%d",
                    HIWORD(pVsInfo->dwFileVersionMS),
                    LOWORD(pVsInfo->dwFileVersionMS),
                    HIWORD(pVsInfo->dwFileVersionLS),
                    LOWORD(pVsInfo->dwFileVersionLS));
                ver = pBuf;
            }
            else
            {
                //mLog.Error("MyFileInfo::Get", "VerQueryValue fail, %s\n", filePath);
            }
        }
        else
        {
            //C++程序没有VS_VERSION_INFO的资源
            //mLog.Error("MyFileInfo::Get", "GetFileVersionInfo fail, %s\n", filePath);
        }
        delete[] pBuf;
    }
    else
    {
        //mLog.Error("MyFileInfo::Get", "GetFileVersionInfoSize fail, %s\n", filePath);
    }
    return ver;
}

string GetCurrentFileVersion()
{
    string ver;
    char path[MAX_PATH];
    DWORD dwSize = GetModuleFileNameA(NULL, path, MAX_PATH);
    if (dwSize > 0) ver = GetFileVersion(path);
    return ver;
}

测试代码

string ver = GetCurrentFileVersion();
MessageBoxA(NULL, ver.c_str(), "fileVersion", MB_OK);

可以看到,最终获取到的文件版本号是FILEVERSION字段
图片.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。