1 std::string GetFIleDescription(TCHAR *file_path){ 2 std::string description = ""; 3 4 //获取版本信息大小 5 DWORD dwSize = GetFileVersionInfoSize(file_path, NULL); 6 if (dwSize > 0) { 7 TCHAR *pBuf = new TCHAR[dwSize + 1]; 8 memset(pBuf, 0, dwSize + 1); 9 //获取版本信息 10 GetFileVersionInfo(file_path, NULL, dwSize, pBuf); 11 12 // Read the list of languages and code pages. 13 LPVOID lpBuffer = NULL; 14 UINT uLen = 0; 15 16 UINT nQuerySize; 17 DWORD* pTransTable; 18 ::VerQueryValue(pBuf, "\VarFileInfo\Translation", (void **)&pTransTable, &nQuerySize); 19 DWORD m_dwLangCharset = MAKELONG(HIWORD(pTransTable[0]), LOWORD(pTransTable[0])); 20 21 TCHAR SubBlock[50] = { 0 }; 22 sprintf_s(SubBlock, 50, "\StringFileInfo\%08lx\FileDescription", m_dwLangCharset); 23 24 VerQueryValue(pBuf, SubBlock, &lpBuffer, &uLen); 25 if (uLen) description = (TCHAR*)lpBuffer; 26 delete[]pBuf; 27 } 28 29 return description; 30 }
pBuf获取倒文件里版本信息内容,然后需要通过VerQueryValue函数去取对应内容。
18行,19行是去文件版本信息里的编码(对应文件属性详细信息的语言项),SubBlock格式化成16进制,然后加上参数去取对应内容。
示例里SubBlock格式化时填的是"FileDescription",即获取文件属性详细信息里的描述项。
这里可选填以下参数:
CompanyName
FileDescription
FileVersion
InternalName
LegalCopyright
OriginalFilename
ProductName
ProductVersion
Comments
LegalTrademarks
PrivateBuild
SpecialBuild
公司名称,文件描述,文件版本等信息都可以通过该方式获取。
注意需要导入库文件,在头文件包含后加上#pragma comment(lib, "version.lib")