- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
vc
vc
用vvcc如何获取某个动态链接库的版本信息
我如何获得安装在我的系统上的某个特定的 DLL 的版本信息?我尝试着确定系统安
装了哪个版本的 comctl32.dll。我见过有些代码调用 GetProcAddress 来获取各种函数,如
InitCommonControlsEx,以确定基于不同版本的函数调用。对于我来说,这是一个坎儿,到
底用什么方法获得版本号?
有两种方法:容易的和难的。容易的方法是调用一个专门用于此目的的函数
DllGetVersion。问题是虽然 comctl32.dll 支持该函数,但并不是所有的 DLLs 都具备它。
如果不具备 DllGetVersion,那么就得用难的方法——使用 FileVersionAPI,这可能是你要
遭遇到的最为暧昧的 API 之一。我写了一个类 CModuleVersion 来封装两种方法,同时还
写了一个Demo程序 VersionDlg 来示范 CModuleVersion 的使用方法。程序画面如 Figure 1
所示。你可以在编辑框中敲入任何系统模块的名字,VersionDlg 将用 DllGetVersion (如果
具备这个函数的话)和 FileVersionAPI 两种方法显示版本信息。源代码参见 Figure 2。
让 我 们 先 看 容 易 的 方 法 。 DllGetVersion 用 DLL 版 本 信 息 填 写 一 个
DLLVERSIONINFO 结构。该结构定义在 Win32SDK 的 showapi.h 头文件中。许多人可能
都没有安装 Platform SDK,那么就得自己定义这个结构了(译者注:实际上,早期的
Developer Studio 不包含这个头文件。后来的 Visual Studio 6.0 安装已经包含该头文件,路
经参见:Driver:\Program Files\Microsoft Visual Studio\VC98\Include),就像我在 VersionDlg
所做的那样。
typedef struct _DllVersionInfo {DWORD cbSize;DWORD dwMajorVersion;DWORD dwMinorVersion;DWORD
dwBuildNumber;DWORD dwPlatformID;} DLLVERSIONINFO;
这个结构中的字段基本不用怎么说明就知道是什么意思:dwPlatformID 为
DLLVER_PLATFORM_WINDOWS ( value = 1 ) 指 Windows 9x , 而
DLLVER_PLATFORM_NT(value = 2)用于 WindowsNT。一旦定义了 DLLVERSIONINFO
结构,就可以调用 DllGetVersion 了,该函数的署名如下:
HRESULTDllGetVersion(DLLVERSIONINFO*);
因为并不是任何给定的 Dll 都输出 DllGetVersion 函数,你得按照标准套路来调用它,
即调用 GetProcAddress 并判断返回值是否为 NULL。我编写的类 CModuleVersion 中含有
一个 DllGetVersion 函数,它把所有细节都进行了封装(参见 Figure2 中的 ModulVer.cpp。)
CModuleVersion 类的使用方法如下:
DLLVERSIONINFO dvi;if (CModuleVersion::DllGetVersion(comctl32.dll, dvi)) { // now info is in dvi}
DllGetVersion 是一个比较新的函数(译者注:在1998年是这样。)对于 comctl32 很好
使,因为它实现并输出 DllGetVersion——但是对于那些不输出 DllGetVersion 的 DLLs 来
说怎么办呢?例如:shell32.dll 就没有实现 DllGetVersion,如 Figure 3 所示。这时你就得
用可怕以及奇怪的 GetFileVersionInfo 和 VerQueryValue 函数,它们在 winver.h 中定义。
大多数可执行程序和 DLLs 都具备 VS_VERSION_INFO 资源,在模块的 RC 文件中
定义。Figure 4 是 VersionDlg 的 RC 文件中的版本信息。你可
原创力文档


文档评论(0)