#Qt下获取DLL等文件版本信息
代码如下
//头文件
#include <windef.h>
#include <winver.h>
//获取文件版本信息
bool FileVersion::getFileVersion(const QString &filename, QString &version)
{
std::string namestr = filename.toStdString();
DWORD dwLen = GetFileVersionInfoSize(filename.toStdWString().c_str(), nullptr);
if(dwLen == 0)
return false;
char * pData;
pData = new char[dwLen +1];
bool bsuccess = GetFileVersionInfoA(filename.toStdString().c_str(), 0, dwLen, pData);
if(!bsuccess)
return false;
struct LANGANDCODEPAGE
{
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
LPVOID lpBuffer = nullptr;
UINT uLen = 0;
bsuccess = VerQueryValue(pData, (TEXT("\\VarFileInfo\\Translation")), (LPVOID*)&lpTranslate, &uLen);
if(!bsuccess)
return false;
QString str1, str2;
str1.setNum(lpTranslate->wLanguage, 16);
str2.setNum(lpTranslate->wCodePage, 16);
str1 = "000" + str1;
str2 = "000" + str2;
QString verPath = "\\StringFileInfo\\"+ str1.right(4) + str2.right(4) +"\\FileVersion";
bsuccess = VerQueryValue(pData, (verPath.toStdWString().c_str()), &lpBuffer, &uLen);
if(!bsuccess)
return false;
version = QString::fromUtf16((const unsigned short int *)lpBuffer);
return true;
}
##调试中发现的问题及解决办法:
###问题1:报错#error: “No Target Architecture”
以构建32位项目为例,在项目的.pro文件中添加
DEFINES += _X86_
如构建为64位项目,则添加
DEFINES += _AMD64_
###问题2:无法解析符号GetFileVersionInfoSize、GetFileVersionInfoA、VerQueryValue
以构建32位项目为例,在项目的.pro文件中添加version.lib,
win32: LIBS += -L'C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/um/x86/' -lVersion
INCLUDEPATH += 'C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/um/x86'
DEPENDPATH += 'C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/um/x86'
如构建64位项目,则添加相应的Version.lib