VerQueryValue与CLID
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相关推荐
- 根据CLID查找缺少的组件
1.在新系统中安装软件报错 2.根据CLSID在可以正常使用的系统中查找缺少的组件 windows在注册表的HKEY_CLASSES_ROOT\CLSID\301FBD10-1CC3-468E-A1F ...
- Windows API函数大全
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
- 怎么这一个c语言的dll文件,如何在C中获取DLL文件的版本信息
感谢您的答案. 这对我有用: WCHAR fileName[_MAX_PATH]; DWORD size = GetModuleFileName(g_dllHandle, fileName, _MAX ...
- (转载博文)VC++API速查
窗口处理 2.1 窗口简介 2.2.1 创建普通窗口(CreateWindow.CreateWindowEx) 2.2.2 关闭窗口(CloseWindow) 2.2.3 销毁窗口(DestroyWi ...
- 给自己的程序添加BugReport
转载:https://www.easyicon.net/(免费icon) 转载:https://www.codeproject.com/Articles/5260/XCrashReport-Excep ...
- 北电PBX资料_LD 17 系統結構指令設定
LD 17 系統結構指令設定 程式提示 輸入指令符號 說 明 備 註 REQ CHG 更改舊資料 END 結束指令 TYPE ADAN ADAN aaa bbb x aaa=NEW,OUT,CHG b ...
- js提取url参数的几种方法。(搜集)
第一,正则表达式,直接找出参数等号右边的值即可.但是,如果该参数后还有&就不可行. <script language="javascript"> ...
- VC MFC程序,在About对话框中获取并显示程序的版本号
=================================================本文为HeYuanHui原作 转载必须确保本文完整并完整保留原作者信息及本文原始链接! NN: ...
- C++ Builder技巧集锦
C++ Builder技巧集锦 1 /* 2 调用DOS程序时不显示窗口 3 使 用 ShellExecute调 用 DOS程 序 时 可 以 不 显 示 窗 口 , 如 :*/ 4 ShellExe ...
最新文章
- Linux必学的系统管理命令
- python3下载安装配置-Linux 安装python3.7.3
- python之列表、字典、集合
- ACCESS中的Update语句不支持Select的解决办法
- RealARM210 V3.2硬件版本 nand flash地址分配明细
- 学弟学妹们,C#为啥学不好?是因为你没真正理解面向对象的思想!
- Windows 10环境下AndroidStudio安装教程(内含如何配置Http Proxy)
- 你的主机中的软件中止了一个已建立的连接。_winscp中文版,winscp中文版软件的使用技巧...
- 树形dp-智慧树下你和我
- matlab输出语句fprintf格式,matlab输出语句fprintf
- 游戏策划游戏研发必读经典题文一
- c语言ascii码16进制,C语言附录ASCII码表.doc
- windows无法完成格式化U盘与U盘修复对几种解决方法
- 9款超级好用的在线PDF工具!
- UVA - 11729 Commando War
- Laravel 消息通知使用 EasySms 短信包插件
- Pygame 实现一个简单画图板
- android开发设置Button背景颜色
- 采购中心如何高效管理供应商的质量?
- PHP 简单案例[5]