本文出自悠然品鉴小悠,转载请注明出处:http://www.youranshare.com/codeorg/sid/138.html
今天在整一个类似于windows任务管理器的东西,其中一个功能就是需要获取到exe,dll这些PE文件的版本信息和描述信息,小悠整了老半天终于还是整出来了,为了以后使用放便,我就做成了一个类给封装了起来,这里给大家分享一下吧.
我封装的这个类叫做CPEFileVersionInfoHelper,这里我说明一下这个类的核心实际上是封装了GetFileVersionInfoSizeA、GetFileVersionInfoA和VerQueryValueA这三个函数,具体这三个函数是干嘛的有兴趣的同学可以去MSDN看一下,小悠这里就不在多说了,下面我将会说明我封装的这个类的用法:
如下图所示,是类CPEFileVersionInfoHelper类的定义:
其中函数GetPEFileVersionInfo是类的接口,你只需要传入对应的PE文件的位置和用于接收PE文件Version信息的PEFILEVERSION_INFO (这货是我定义的一个std::map)就能获取到你想要的PE文件的Version信息.
定义了4种状态返回值,作为函数GetPEFileVersionInfo的返回值.
#define READ_SUCCESS 0x00//获取成功 #define READ_ERROR 0x01//获取失败 #define READ_INVALID_INIT 0x02//错误的初始化导致的,失败 #define READ_HEAP_REEO 0x03//内部的new操作挂掉导致的
一个PE文件的Version信息有很多种,我列出了所有的类型
//需要获取的PE信息 #define Comments "Comments" #define CompanyName "CompanyName" #define FileDescription "FileDescription" #define FileVersion "FileVersion" #define InternalName "InternalName" #define LegalCopyright "LegalCopyright" #define LegalTrademarks "LegalTrademarks" #define OriginalFilename "OriginalFilename" #define PrivateBuild "PrivateBuild" #define ProductName "ProductName" #define ProductVersion "ProductVersion" #define SpecialBuild "SpecialBuild"
定义了用于保存PE 文件Version信息的map<string,string>,其中map的key表示Version信息的索引,例如: map[“FileDescription”] 存放了描述信息.
定义一个宏用于添加map的key值,你需要获取什么Version信息你就调用这个宏添加,例如 P_B(peinfo,FileDescription); P_B(peinfo,FileVersion);表示你要查询 “FileDescription”和”FileVersion “ 查询的结果将会放到peinfo中去
还有一个定义,就是一下子添加所有的查询= =
下面我将演示一下如何使用这个类:
① 我想获取到C:\Windows\System32\calc.exe这个文件的所有信息:
执行上面的代码我们可以得到下面的结果:
② 我想获取C:\Windows\System32\regedt32.exe这个文件的部分信息.
运行上面的代码可以得到下面的结果:
总的来说,通过小悠写的这个CPEFileVersionInfoHelper类,你可以很轻松的获取到exe、dll这些PE文件的 版权信息、作者信息、文件说明、商标信息等
下面附上小悠的这个CPEFileVersionInfoHelper类的VC6.0的示例工程下载地址:
解压密码 yscode
百度网盘下载地址:http://pan.baidu.com/s/1qW6r2bi