#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