Win32 程序添加并获取版本号
【摘要】 打出的 Release 包在项目右键,点击生成,或点击VS上面绿色三角形按钮,会生成当前项目的exe程序exe程序的输出路径,在底部的“输出对话框”中找到这个位置,随便右击一个exe程序,选择属性然后切换到详细信息选项卡,可以发现,默认情况下,并不会带上版本号 为exe程序添加版本号在“解决方案资源管理器”面板中,切换到“资源视图”右击项目,添加资源在弹出的对话框中,选择version,点...
打出的 Release 包
在项目右键,点击生成,或点击VS上面绿色三角形按钮,会生成当前项目的exe程序
exe程序的输出路径,在底部的“输出对话框”中
找到这个位置,随便右击一个exe程序,选择属性
然后切换到详细信息选项卡,可以发现,默认情况下,并不会带上版本号
为exe程序添加版本号
在“解决方案资源管理器”面板中,切换到“资源视图”
右击项目,添加资源
在弹出的对话框中,选择version
,点击“新建”按钮,将version
添加进项目
右键项目,点击生成,再次查看,可以发现版本号已经出现了
各个版本号的区别
可以看到,版本号总共有4个
- FILEVERSION
- PRODUCTVERSION
- FileVersion
- ProductVersion
理论上,4个版本号应该设为一致,但如果不一致,会显示出哪个版本号呢,让我们来试验一下。首先,修改版本号如下
生成exe,并打开其属性,可以看到,最终生效的是FILEVERSION
和FILEVERSION
注意:经过测试发现:在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
字段
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)