VerQueryValue是常用的用于查询/获取PE文件信息的API。

但对于某些exe或dll文件,却出现了问题。

一般的做法,首先通过如下代码,获取文件的语言代码和代码页信息:

typedef  struct _LANGANDCODEPAGE
{WORD wLanguage;WORD wCodePage;
}LANGANDCODEPAGE;LANGANDCODEPAGE* m_lpTransTable = nullptr;::VerQueryValue(lpVersionData, _T("\\VarFileInfo\\Translation"),  (void **)&m_lpTransTable, &nQuerySize);

第二部,通过如下代码进行各类信息的查询:

CString strBlockName;
strBlockName.Format(_T("\\StringFileInfo\\%04x%04x\\%s"),m_lpTransTable[0].wLanguage,m_lpTransTable[0].wCodePage,lpszValueName);::VerQueryValue((void **)m_lpVersionData, strBlockName,   &lpData, &nQuerySize);

然而,在对以上代码进行测试时发现,对某些exe,VerQueryValue始终返回FALSE,通过GetLastError获取错误代码为1813,也就是ERROR_RESOURCE_TYPE_NOT_FOUND。

但是奇怪的是,通过右键菜单查看属性的”详细信息“,可以看到各类文件信息。

经过一番研究,终于弄清楚原委:

直接原因是是第二部中m_lpTransTable[0].wLanguage的问题。

实际上,这个WORD类型的wLanguage就是CLID(详细可参考我的这篇文章《操作系统的语言ID(LCID)》)

我们获取到的exe文件的CLID是0x0000,也就是语言中性的(Language-Neutral)。也就是说,使用这个CLID在这个exe文件中是查不到任何信息的,那么换成其他的CLID取值呢?

我这里用0904进行了替换,再运行,OK了。

这个问题存在于很多Windows自带的文件中,这就像个脑经急转弯,弄清楚了也就那么回事,但一开始却不容易想到。

只是不知道微软为什么要这么做,是无意的,还是想对开发人员隐藏一些信息呢。

VerQueryValue与CLID相关推荐

  1. 根据CLID查找缺少的组件

    1.在新系统中安装软件报错 2.根据CLSID在可以正常使用的系统中查找缺少的组件 windows在注册表的HKEY_CLASSES_ROOT\CLSID\301FBD10-1CC3-468E-A1F ...

  2. Windows API函数大全

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  3. 怎么这一个c语言的dll文件,如何在C中获取DLL文件的版本信息

    感谢您的答案. 这对我有用: WCHAR fileName[_MAX_PATH]; DWORD size = GetModuleFileName(g_dllHandle, fileName, _MAX ...

  4. (转载博文)VC++API速查

    窗口处理 2.1 窗口简介 2.2.1 创建普通窗口(CreateWindow.CreateWindowEx) 2.2.2 关闭窗口(CloseWindow) 2.2.3 销毁窗口(DestroyWi ...

  5. 给自己的程序添加BugReport

    转载:https://www.easyicon.net/(免费icon) 转载:https://www.codeproject.com/Articles/5260/XCrashReport-Excep ...

  6. 北电PBX资料_LD 17 系統結構指令設定

    LD 17 系統結構指令設定 程式提示 輸入指令符號 說 明 備 註 REQ CHG 更改舊資料 END 結束指令 TYPE ADAN ADAN aaa bbb x aaa=NEW,OUT,CHG b ...

  7. js提取url参数的几种方法。(搜集)

    第一,正则表达式,直接找出参数等号右边的值即可.但是,如果该参数后还有&就不可行.     <script language="javascript">     ...

  8. VC MFC程序,在About对话框中获取并显示程序的版本号

    =================================================本文为HeYuanHui原作 转载必须确保本文完整并完整保留原作者信息及本文原始链接! NN:     ...

  9. C++ Builder技巧集锦

    C++ Builder技巧集锦 1 /* 2 调用DOS程序时不显示窗口 3 使 用 ShellExecute调 用 DOS程 序 时 可 以 不 显 示 窗 口 , 如 :*/ 4 ShellExe ...

最新文章

  1. Linux必学的系统管理命令
  2. python3下载安装配置-Linux 安装python3.7.3
  3. python之列表、字典、集合
  4. ACCESS中的Update语句不支持Select的解决办法
  5. RealARM210 V3.2硬件版本 nand flash地址分配明细
  6. 学弟学妹们,C#为啥学不好?是因为你没真正理解面向对象的思想!
  7. Windows 10环境下AndroidStudio安装教程(内含如何配置Http Proxy)
  8. 你的主机中的软件中止了一个已建立的连接。_winscp中文版,winscp中文版软件的使用技巧...
  9. 树形dp-智慧树下你和我
  10. matlab输出语句fprintf格式,matlab输出语句fprintf
  11. 游戏策划游戏研发必读经典题文一
  12. c语言ascii码16进制,C语言附录ASCII码表.doc
  13. windows无法完成格式化U盘与U盘修复对几种解决方法
  14. 9款超级好用的在线PDF工具!
  15. UVA - 11729 Commando War
  16. Laravel 消息通知使用 EasySms 短信包插件
  17. Pygame 实现一个简单画图板
  18. android开发设置Button背景颜色
  19. 采购中心如何高效管理供应商的质量?
  20. PHP 简单案例[5]

热门文章

  1. 霜之哀伤sketchup模型
  2. LayaAir基础(3) 之 场景的搭建
  3. 为什么要做接口测试?好处是什么?什么是接口?不同接口类型的差异是什么?
  4. 软件设计师考试笔记-(7)
  5. Round3:我的黑白框雷霆战机进阶2
  6. ubuntu 16.04 安装配置 python3.6
  7. 4Sum -- LeetCode
  8. RecycleView和Adapter的基本使用
  9. 3d样式的button按钮
  10. 【渗透测试简介入门简介】