win32 获取文件版本、描述等信息

 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")

posted @ 2020-09-30 14:21  YZHuang  阅读(1119)  评论(0编辑  收藏  举报