QT获取dll库文件详细信息
创始人
2024-05-27 19:04:05
0

一、需求背景

获取软件下依赖的dll库的版本信息,如下图所示版本为1.0.7.1018

二、实现方法

2.1步骤

windows下实现,基于version.lib(version.dll)提供的函数获取这些信息

  1. 首先使用GetFileVersionInfoSizeA(W)获取VersionInfo的大小,申请缓冲区;

  1. 接着使用GetFileVersionInfoA(W)获取VersionInfo数据到缓冲区;

  1. 接着使用VerQueryValueA(W)依次获取\,\VarFileInfo\Translation,再根据Translation获取语言类型,接着\VarFileInfo\080404B0\ProductVersion便获取到了版本信息。

参考:https://www.cnblogs.com/comor/p/10607383.html

2.2 源码

#include 
#include 
#include 
#include 
#include BOOL GetFileInfoStringWinApi(LPCTSTR pFileName, LPCTSTR pName /* = NULL */, LPTSTR ptBuf, UINT lenBuf)
{DWORD   dwDummyHandle = 0; // will always be set to zeroDWORD   dwLen = 0;BYTE    *pVersionInfo = NULL;BOOL    bRetVal;VS_FIXEDFILEINFO    FileVersion;HMODULE        hVerDll;hVerDll = LoadLibrary(_T("VERSION.dll"));if (hVerDll == NULL){return FALSE;}#ifdef _UNICODEtypedef DWORD(WINAPI * Fun_GetFileVersionInfoSize)(LPCTSTR, DWORD *);typedef BOOL(WINAPI * Fun_GetFileVersionInfo)(LPCTSTR, DWORD, DWORD, LPVOID);typedef BOOL(WINAPI * Fun_VerQueryValue)(LPCVOID, LPCTSTR, LPVOID, PUINT);
#elsetypedef DWORD(WINAPI * Fun_GetFileVersionInfoSize)(LPCSTR, DWORD *);typedef BOOL(WINAPI * Fun_GetFileVersionInfo)(LPCSTR, DWORD, DWORD, LPVOID);typedef BOOL(WINAPI * Fun_VerQueryValue)(LPCVOID, LPCSTR, LPVOID, PUINT);
#endifFun_GetFileVersionInfoSize        pGetFileVersionInfoSize;Fun_GetFileVersionInfo            pGetFileVersionInfo;Fun_VerQueryValue                pVerQueryValue;#ifdef _UNICODEpGetFileVersionInfoSize = (Fun_GetFileVersionInfoSize)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeW");pGetFileVersionInfo = (Fun_GetFileVersionInfo)::GetProcAddress(hVerDll, "GetFileVersionInfoW");pVerQueryValue = (Fun_VerQueryValue)::GetProcAddress(hVerDll, "VerQueryValueW");
#elsepGetFileVersionInfoSize = (Fun_GetFileVersionInfoSize)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeA");pGetFileVersionInfo = (Fun_GetFileVersionInfo)::GetProcAddress(hVerDll, "GetFileVersionInfoA");pVerQueryValue = (Fun_VerQueryValue)::GetProcAddress(hVerDll, "VerQueryValueA");
#endifstruct TRANSLATION{WORD langID;            // language IDWORD charset;            // character set (code page)} Translation;Translation.langID = 0x0409;    //Translation.charset = 1252;        // default = ANSI code pagedwLen = pGetFileVersionInfoSize(pFileName, &dwDummyHandle);if (dwLen == 0){bRetVal = FALSE;goto End;}pVersionInfo = new BYTE[dwLen]; // allocate version infobRetVal = pGetFileVersionInfo(pFileName, 0, dwLen, pVersionInfo);if (bRetVal == FALSE){goto End;}VOID     *pVI;UINT    uLen;bRetVal = pVerQueryValue(pVersionInfo, _T("\\"), &pVI, &uLen);if (bRetVal == FALSE){goto End;}memcpy(&FileVersion, pVI, sizeof(VS_FIXEDFILEINFO));bRetVal = pVerQueryValue(pVersionInfo, _T("\\VarFileInfo\\Translation"),&pVI, &uLen);if (bRetVal && uLen >= 4){memcpy(&Translation, pVI, sizeof(TRANSLATION));}else{bRetVal = FALSE;goto End;}//  BREAKIF(FileVersion.dwSignature != VS_FFI_SIGNATURE);if (FileVersion.dwSignature != VS_FFI_SIGNATURE){bRetVal = FALSE;goto End;}VOID        *pVal;UINT        iLenVal;if (pName == NULL){_stprintf_s(ptBuf, lenBuf, _T("%d.%d.%d.%d"),HIWORD(FileVersion.dwFileVersionMS), LOWORD(FileVersion.dwFileVersionMS),HIWORD(FileVersion.dwFileVersionLS), LOWORD(FileVersion.dwFileVersionLS));}else{TCHAR    szQuery[1024];_stprintf_s(szQuery, 1024, _T("\\StringFileInfo\\%04X%04X\\%s"),Translation.langID, Translation.charset, pName);bRetVal = pVerQueryValue(pVersionInfo, szQuery, &pVal, &iLenVal);if (bRetVal){_stprintf_s(ptBuf, lenBuf, _T("%s"), (TCHAR *)pVal);}else{_stprintf_s(ptBuf, lenBuf, _T("%s"), _T(""));}}End:FreeLibrary(hVerDll);hVerDll = NULL;delete[] pVersionInfo;pVersionInfo = NULL;return bRetVal;
}bool GetFileInfoString(const QString &fileName, const QString &name, QString &value)
{TCHAR *ptszStr = NULL;ptszStr = new TCHAR[1024];LPCWSTR fileName_wstr = reinterpret_cast(fileName.data());LPCWSTR name_wstr = reinterpret_cast(name.data());BOOL bRet = GetFileInfoStringWinApi(fileName_wstr, name_wstr, ptszStr, 1024);value = QString::fromWCharArray(ptszStr);delete ptszStr;ptszStr = NULL;return bRet;
}QString GetFileProductVersion(const QString &fileName)
{QString version;GetFileInfoString(fileName, "ProductVersion", version);return version;
}

2.3 测试结果

int main(int argc, char *argv[])
{QString fileName = "xxx//CZVisionCameraOperator.dll";qDebug() << GetFileProductVersion(fileName);return 0;
}

2.4 扩展

除版本信息,还可以获取文件说明、产品名称、版权、公司名称、原始文件名称等

FileDescription 文件说明

FileVersion 文件版本

ProductName 产品名称

ProductVersion 产品版本

LegalCopyright 版权

CompanyName 公司名称

OriginalFilename 原始文件名

相关内容

热门资讯

How I learned ... How I learned to learn EnglishEssay 1Learning a ne...
悬崖之上电影推送范文英语【精... 悬崖之上电影推送范文英语 篇一Title: "Beyond the Cliff" - A Cinem...
暑假高中英语作文【精彩3篇】 暑假高中英语作文 篇一:The Importance of Summer ReadingSummer...
英语作文各类信件模板范文【通... 英语作文各类信件模板范文 篇一Dear [Recipient's Name],I hope this...
Take your time... Take your time英语作文 篇一The Importance of Taking Your...
学生英语演讲稿因为你(最新3... 学生英语演讲稿因为你 篇一因为你,我变得更自信了尊敬的老师们,亲爱的同学们:大家好!今天我非常荣幸能...
Happiness的英语作文... Happiness的英语作文 篇一Title: The Pursuit of HappinessHa...
传统节日英语作文【精简6篇】 传统节日英语作文 篇一Chinese New YearChinese New Year, also ...
假期的英语作文【优质6篇】 假期的英语作文 篇一:我的暑假计划Summer vacation is always a highl...
介绍爷爷的英语作文带翻译(最... 篇一: My GrandfatherMy grandfather is a remarkable m...
大学英语作文:熟能生巧 大学英语作文:熟能生巧  在平日的学习、工作和生活里,大家都跟作文打过交道吧,借助作文可以提高我们的...
英语作文的格式 书信范文16... 英语作文的格式 书信范文16篇 篇一学生自我介绍信Dear Sir/Madam,I am writi...
学会放松自己中考英语作文(经... 学会放松自己中考英语作文 篇一如何学会放松自己放松自己是一项重要的技能,尤其对于即将参加中考的同学们...
希望的英语作文(精彩3篇) 希望的英语作文 篇一Title: The Power of HopeHope is a powerf...
在你心中独一无二的英语句子(... 在你心中独一无二的英语句子 篇一在我心中独一无二的英语句子是“Dream big and dare ...
以游泳运动员为题的英语作文带... 以游泳运动员为题的英语作文带翻译  Karen is on the swim team. She i...
英语作文:清明节 The T... 英语作文:清明节 The Tomb Sweeping Day  在我们平凡的日常里,大家总少不了接触...
灾难英语作文【最新6篇】 灾难英语作文 篇一:地震的恐惧与希望地震是一种令人恐惧的自然灾害,它不仅给人们的生活和财产造成巨大损...
租船询盘函范文英语(优秀6篇... 租船询盘函范文英语 篇一Dear Sir/Madam,We are writing to inqui...
鲨鱼英语作文【经典3篇】 鲨鱼英语作文 篇一:鲨鱼的生态环境与保护Sharks: their Ecological Envir...