参考链接:

1、MS docs - GetFileVersionInfoA:https://docs.microsoft.com/zh-cn/windows/desktop/api/winver/nf-winver-getfileversioninfoa

2、Cppblog - Win32汇编--使用资源—版本信息资源:http://www.cppblog.com/luqingfei/archive/2010/09/21/127239.html

3、CSDN blog - 【PE】Windows资源文件rc定义和使用:https://blog.csdn.net/soaringlee_fighting/article/details/80596261

4、CSDN blog - 获取EXE版本信息 GetFileVersionInfo:https://blog.csdn.net/mfkjq/article/details/53064243

在一些hips软件中,会显示一些exe、dll、sys等的厂商信息,这些信息便存在于"详细信息"中。

0、什么是StringFileInfo

通俗来说,这里的“详细信息”指PE文件(dll,exe,sys等)的信息,包括属性页中的“详细信息”tab页中一部分内容



对应VS中的.rc中的VS_VERSION_INFO信息



以及*.rc文件源码中的VS_VERSION_INFO部分

1、获取方法

如果E文可以,请直接阅读MS Docs中GetFileVersionInfoA说明,详细权威,且VerQueryValueA部分有一段示例代码。

微软version.lib(version.dll)提供了中的3个函数用来获取这些信息,获取步骤:

  • 首先使用GetFileVersionInfoSizeA(W)获取VersionInfo的大小,申请缓冲区;
  • 接着使用GetFileVersionInfoA(W)获取VersionInfo数据到缓冲区
  • 接着使用VerQueryValueA(W)依次获取\\VarFileInfo\Translation,再根据Translation获取语言类型,接着\VarFileInfo\080404B0\CompanyName便获取到了厂商信息。

附:CompanyName域可取值:

2、示例代码

// conGetVer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include "pch.h"
#include <tchar.h>
#include <windows.h>
#include <iostream> // pName可取值:
// _T("CompanyName"),_T("FileDescription"),_T("FileVersion"),
// _T("InternalName"),_T("LegalCopyright"),_T("OriginalFilename"),
// _T("ProductName"),_T("ProductVersion"),
BOOL GetFileVersionString(LPCTSTR pFileName, LPCTSTR pName /* = NULL */, LPTSTR ptBuf, UINT lenBuf)
{
DWORD dwDummyHandle = 0; // will always be set to zero
DWORD dwLen = 0;
BYTE* pVersionInfo = NULL;
BOOL bRetVal; VS_FIXEDFILEINFO FileVersion; HMODULE hVerDll;
hVerDll = LoadLibrary(_T("VERSION.dll"));
if (hVerDll == NULL)
return FALSE; #ifdef _UNICODE
typedef DWORD(WINAPI *Fun_GetFileVersionInfoSize)(LPCTSTR, DWORD *);
typedef BOOL(WINAPI *Fun_GetFileVersionInfo)(LPCTSTR, DWORD, DWORD, LPVOID);
typedef BOOL(WINAPI *Fun_VerQueryValue)(LPCVOID, LPCTSTR, LPVOID, PUINT);
#else
typedef DWORD(WINAPI *Fun_GetFileVersionInfoSize)(LPCSTR, DWORD *);
typedef BOOL(WINAPI *Fun_GetFileVersionInfo)(LPCSTR, DWORD, DWORD, LPVOID);
typedef BOOL(WINAPI *Fun_VerQueryValue)(LPCVOID, LPCSTR, LPVOID, PUINT);
#endif Fun_GetFileVersionInfoSize pGetFileVersionInfoSize;
Fun_GetFileVersionInfo pGetFileVersionInfo;
Fun_VerQueryValue pVerQueryValue; #ifdef _UNICODE
pGetFileVersionInfoSize = (Fun_GetFileVersionInfoSize)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeW");
pGetFileVersionInfo = (Fun_GetFileVersionInfo)::GetProcAddress(hVerDll, "GetFileVersionInfoW");
pVerQueryValue = (Fun_VerQueryValue)::GetProcAddress(hVerDll, "VerQueryValueW");
#else
pGetFileVersionInfoSize = (Fun_GetFileVersionInfoSize)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeA");
pGetFileVersionInfo = (Fun_GetFileVersionInfo)::GetProcAddress(hVerDll, "GetFileVersionInfoA");
pVerQueryValue = (Fun_VerQueryValue)::GetProcAddress(hVerDll, "VerQueryValueA");
#endif struct TRANSLATION {
WORD langID; // language ID
WORD charset; // character set (code page)
} Translation; Translation.langID = 0x0409; //
Translation.charset = 1252; // default = ANSI code page dwLen = pGetFileVersionInfoSize(pFileName, &dwDummyHandle);
if (dwLen == 0)
{
bRetVal = FALSE;
goto End;
} pVersionInfo = new BYTE[dwLen]; // allocate version info
bRetVal = 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;
} int main()
{
TCHAR* ptszStr = NULL; ptszStr = new TCHAR[1024];
BOOL bRet = GetFileVersionString(_T("F:\\Wireshark-win32-1.11.2.exe"),
_T("CompanyName"), ptszStr, 1024); delete ptszStr;
ptszStr = NULL; std::cout << "Hello World!\n";
}

获取文件属性“详细信息” - StringFileInfo的更多相关文章

  1. ttf文件属性详细信息

    python实现ttf文件属性详细信息 import sys from fontTools import ttLib def shortName( font ): name = "" ...

  2. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  3. 钉钉开发入门,微应用识别用户身份,获取用户免登授权码code,获取用户userid,获取用户详细信息

    最近有个需求,在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去企业内部的用户中心做校验,校验通过,相关子系统直接登陆; 就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所 ...

  4. 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”

    之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...

  5. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> UF_initialize ...

  6. 【Android Developers Training】 99. 获取联系人详细信息

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. winPcap编程之获取适配器详细信息(三)

    显示适配器详细信息 先贴上代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #includ ...

  8. ionic基于GPS定位并通过百度地图获取定位详细信息

    相信所有的前端攻城狮都会碰到移动端App.里面获取用户定位信息. 那么问题来了,怎么获取用户的定位信息(经纬度)呢. 当然方法有很多,通过百度地图API 以及 高德地图 API都是可以的.但是两个获取 ...

  9. Python-根据照片信息获取用户详细信息(微信发原图或泄露位置信息)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 蒙娜丽胖 PS:如有需要Python学习资料的小伙伴可以加点击下方 ...

随机推荐

  1. C#:安装Windows服务,动态指定服务名及描述(转载)

    来源:http://www.cnblogs.com/Fooo/p/3476675.html Installer.cs public Installer() { InitializeComponent( ...

  2. The good life is one inspired by love and guided by knowledge

    The good life is one inspired by love and guided by knowledge 伯特兰·罗素Bertrand Russell18721970 I can a ...

  3. 51nod 1349 最大值

    题目看这里 找到每个元素g[i]作为最大值的区间[L,R],那么以他为最大值的区间数有(i-L+1)*(R-i+1)个. 为了加速,以k为最大值的区间数放入H[k],再以此统计一个前缀和,更新入H.那 ...

  4. java二维数组定义初始化-杨辉三角

    public class Array2Demo2_3 { public static void main(String[] args) { //定义初始化 int[][] arr = new int[ ...

  5. poi导出excel出现本工作薄不能再使用其他新字体的解决方法

    最近使用POI处理EXCEL,当处理的单元格太多时,就会出现,本工作薄使用字体过多,不能再使用其他新的字体的是提示. 网上很多方法告诉我,要怎么修改excel文件,但是这个解决不了问题啊,难道让客户去 ...

  6. vue 项目搭建笔记1

    1.首先安装node.js(傻瓜式安装,安装路径默认C盘) 2.打开node.js command prompt 3.进入想放项目的文件夹.如D:  -->回车 4.进入具体文件夹,如cd wo ...

  7. 【OpenCV】【MFC】图片、视频、摄像头输入响应【详细图解】

    记住新建项目后,要配置OpenCV环境!参考链接http://blog.csdn.net/zy122121cs/article/details/49180541 做工程搭建框架什么的,基本的要熟练啊. ...

  8. LOJ #6436. 「PKUSC2018」神仙的游戏

    题目分析 通过画图分析,如果存在border长度为len,则原串一定是长度为n-len的循环串. 考虑什么时候无法形成长度为len的循环串. 显然是两个不同的字符的距离为len的整数倍时,不存在这样的 ...

  9. Tableau10.4中智能显示点击后消失的解决方案

    如果你的电脑是Win10,并且是高分屏,可能会出现和我一样的问题,就点击智能显示后,发现找不到了. 那么解决方案就是: 这样就能找到智能显示了.

  10. android中反射技术使用实例

    在计算机科学领域.反射是指一类应用,它们能够自描写叙述和自控制.也就是说,这类应用通过採用某种机制来实现对自己行为的描写叙述(self-representation)和监測(examination), ...