参考链接:

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. 二、WPF datagrid 行变色

    public void Color(){ DataGridRow row1 = (DataGridRow)this.dgSource.ItemContainerGenerator.ContainerF ...

  2. 乘风破浪:LeetCode真题_016_3Sum Closest

    乘风破浪:LeetCode真题_016_3Sum Closest 一.前言      这一次,问题又升级了,寻找的是三个数之和最靠近的某个数,这是非常让人难以思考的,需要把三个数相加之后和最后给的目标 ...

  3. 沉淀再出发:OpenStack初探

    沉淀再出发:OpenStack初探 一.前言 OpenStack是IaaS的一种平台,通过各种虚拟化来提供服务.我们主要看一下OpenStack的基本概念和相应的使用方式. 二.OpenStack的框 ...

  4. CopyrightHelper—开源VS插件辅助插入版权注释

    前言 有很多时候,我们在写代码的时候需要在代码文件头加上描述和版权信息等,如果使用代码项目模板又得为每种文件定模板,而已不方便,如果从某个地方复制过来,又嫌麻烦... 为了能解决这种懒人的需求,我开始 ...

  5. January 08 2017 Week 2nd Sunday

    Believe not all that you see nor half what you hear. 眼见的不能全信,耳闻的也不能半信. What you hear, what you see, ...

  6. 在Eclipse中通过build.xml导入工程

    http://www.zihou.me/html/2012/10/18/7868.html

  7. [CTSC2018]假面

    题目 先来考虑一下第一问,血量有\(P\)的概率减\(1\) 由于我们最后需要求每一个人的期望血量,于是考虑维护出每个人处于不同血量时候的概率 一个简单\(dp\)即可 \[dp_{i,j}=dp_{ ...

  8. No.3 - CSS transition 和 CSS transform 配合制作动画

    课程概述 作业提交截止时间:09-01 任务目的 深度理解掌握 transition-timing-function 以及它的意义 学会配合使用 CSS transform 和CSS transiti ...

  9. 文件断点上传,html5实现前端,java实现服务器

    断点上传能够防止意外情况导致上传一半的文件下次上传时还要从头下载,网上有很多关于断点的实现,这篇文章只是从前到后完整的记录下一个可用的实例,由于生产环境要求不高,而且就是提供给一两个人用,所以我简化了 ...

  10. Mac OS X文件系统的附加属性@如何彻底删除

    有时候在 Mac 系统下读写 NTFS 分区时,会发现一些文件不能打开. 显示错误为: 项目“XXX”已被 OS X 使用,不能打开. 如果再终端 ls -al 命令一下就可以看到: -rwxr-xr ...