文章目录
前言
本文主要讲述如何在Visual Studio 2019 以及Qt结合的开发项目中,新增版本信息到资源;并且可以通过代码读取资源存储的版本信息。
一、如何在VisualStudio2019中新增项目版本信息
-
切换到解决方案视图中
-
在解决方案名称上右键
-
添加
-
资源
-
-
选择Version,点击新建
-
-
按照自己的公司,版权,版本信息填写并保存编译
二、在程序中调用项目版本信息
为了保证整个项目的统一性,建议版本维护就在这里维护,如果项目中,界面里要调用到相关信息,那么就通过如下操作对里面的信息进行读取
1.引入库version.lib
1.1.通过vs自带的属性页引入库
- 切换到属性管理器页
- 右键Debug/Release,添加新项目属性表
- 随便起个名
- 在链接器-输入-附加依赖项中添加version.lib
- 应用并确定
1.2.手动引入库
代码如下(示例):
#pragma comment(lib, "version.lib")
2.新增版本信息读取类
新增头文件
#pragma once
#include <QObject>
#include <windows.h>
#include <tchar.h>
class VersionUpdate
{
public:
QString product_name = "";
QString company_info = "";
QString copyright_info = "";
QString version_info = "";
QString VersionUpdate::GetVersion()
{
int nMaxPathName = 4096; // Max length of file name/path
TCHAR* pBuffer;
UINT nItemLength;
void* pData, * lpBuffer;
QString sVersion;
DWORD dwInfoSize, dwHandle;
VS_FIXEDFILEINFO* pFileInfo;
// Get the file path and name
pBuffer = new TCHAR[nMaxPathName];
GetModuleFileName(NULL, pBuffer, nMaxPathName - 1);
// Get File Version Info size
dwInfoSize = GetFileVersionInfoSize(pBuffer, &dwHandle);
if (dwInfoSize > 0)
{
pData = new TCHAR[dwInfoSize];
if (GetFileVersionInfo(pBuffer, dwHandle, dwInfoSize, pData))
{
//获取产品名称
if (VerQueryValue(pData, _T("\\StringFileInfo\\080404b0\\ProductName"), &lpBuffer, &nItemLength))
{
product_name = QString::fromWCharArray((LPCTSTR)lpBuffer, nItemLength);
}
//获取公司信息
if (VerQueryValue(pData, _T("\\StringFileInfo\\080404b0\\CompanyName"), &lpBuffer, &nItemLength))
{
company_info = QString::fromWCharArray((LPCTSTR)lpBuffer, nItemLength);
}
//获取版权信息
if (VerQueryValue(pData, _T("\\StringFileInfo\\080404b0\\LegalCopyright"), &lpBuffer, &nItemLength))
{
copyright_info = QString::fromWCharArray((LPCTSTR)lpBuffer, nItemLength);
}
//获取主次版本号
if (VerQueryValue(pData, _T("\\"), &lpBuffer, &nItemLength))
{
pFileInfo = (VS_FIXEDFILEINFO*)lpBuffer;
sVersion = QString("%1.%2.%3.%4")
.arg(pFileInfo->dwProductVersionMS >> 16)
.arg(pFileInfo->dwProductVersionMS & 0xFFFF)
.arg(pFileInfo->dwProductVersionLS >> 16)
.arg(pFileInfo->dwProductVersionLS & 0xFFFF);
// Calculate the product version as a number, you can delete the next statement if you don't need it.
DWORD dwProductVersion = (pFileInfo->dwProductVersionMS >> 16) * 1000 +
(pFileInfo->dwProductVersionMS & 0xFFFF) * 100 +
(pFileInfo->dwProductVersionLS >> 16) * 10 +
(pFileInfo->dwProductVersionLS & 0xFFFF) * 1;
version_info = sVersion;
}
}
// Delete the data buffer
delete[] pData;
}
// Get rid of the allocated string buffer
delete[] pBuffer;
return sVersion;
}
private:
};
我的办法很笨,反正就是这么用就能拿到。借用了别人的部分想法
3.调用类获取信息
//版本信息获取
#include "version_info.h"
int main(int argc, char* argv[])
{
VersionUpdate newVersionInfo;
newVersionInfo.GetVersion();
C_NAME = newVersionInfo.product_name;
soft_version = newVersionInfo.version_info;
C_NAME.truncate(C_NAME.indexOf(QChar::Null));
qDebug() << QString("日志记录开始 软件%1 版本%2").arg(C_NAME).arg(soft_version);
}
基本上就这样,最后版本信息就能存储并调用
原来的版本信息:
改后的版本信息:
总结
以上为如何在Visual Studio 2019 以及Qt结合的开发项目中,新增版本信息到资源;并且可以通过代码读取资源存储的版本信息。