如何获取某个动态链接库的版本信息

我如何获得安装在我的系统上的某个特定的 DLL 的版本信息?我尝试着确定系统安装了哪个版本的 comctl32.dll。我见过有些代码调用 GetProcAddress 来获取各种函数,如 InitCommonControlsEx,以确定基于不同版本的函数调用。对于我来说,这是一个坎儿,到底用什么方法获得版本号?

有两种方法:容易的和难的。容易的方法是调用一个专门用于此目的的函数 DllGetVersion。问题是虽然 comctl32.dll 支持该函数,但并不是所有的 DLLs 都具备它。如果不具备 DllGetVersion,那么就得用难的方法——使用 FileVersion API,这可能是你要遭遇到的最为暧昧的 API 之一。我写了一个类 CModuleVersion 来封装两种方法,同时还写了一个Demo程序 VersionDlg 来示范 CModuleVersion 的使用方法。程序画面如 Figure 1 所示。你可以在编辑框中敲入任何系统模块的名字,VersionDlg 将用 DllGetVersion (如果具备这个函数的话)和 FileVersion API 两种方法显示版本信息。源代码参见 Figure 2。

Figure 1 运行中的 VersionDlg 程序

让我们先看容易的方法。DllGetVersion 用 DLL 版本信息填写一个 DLLVERSIONINFO 结构。该结构定义在 Win32 SDK 的 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)用于 Windows NT。一旦定义了 DLLVERSIONINFO 结构,就可以调用 DllGetVersion 了,该函数的署名如下:

HRESULT DllGetVersion(DLLVERSIONINFO*);

因为并不是任何给定的 Dll 都输出 DllGetVersion 函数,你得按照标准套路来调用它,即调用 GetProcAddress 并判断返回值是否为 NULL。我编写的类 CModuleVersion 中含有一个 DllGetVersion 函数,它把所有细节都进行了封装(参见 Figure 2 中的 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 中定义。

Figure 3 No DllGetVersion Info

时间: 2024-10-02 11:43:57

如何获取某个动态链接库的版本信息的相关文章

Android编程获取包名,版本信息及VersionName名称的方法_Android

本文实例讲述了Android编程获取包名,版本信息及VersionName名称的方法.分享给大家供大家参考,具体如下: 话不多说,直接上代码,此处,主要是在版本升级的时候,使用较多. private String getAppInfo() { try { String pkName = this.getPackageName(); String versionName = this.getPackageManager().getPackageInfo( pkName, 0).versionNam

Js 获取、判断浏览器版本信息的简单方法_javascript技巧

Navigator 对象包含有关浏览器的信息: •appCodeName -- 浏览器代码名的字符串表示 •appName -- 官方浏览器名的字符串表示 •appVersion -- 浏览器版本信息的字符串表示 •cookieEnabled -- 如果启用cookie返回true,否则返回false •javaEnabled -- 如果启用java返回true,否则返回false •platform -- 浏览器所在计算机平台的字符串表示 •plugins -- 安装在浏览器中的插件数组 •t

python获取Linux下文件版本信息、公司名和产品名的方法_python

本文实例讲述了python获取Linux下文件版本信息.公司名和产品名的方法,分享给大家供大家参考.具体如下: 区别于前文所述.本例是在linux下得到文件版本信息,主要是通过pefile模块解析文件 中的字符串得到的.代码如下: def _get_company_and_product(self, file_path): """ Read all properties of the given file return them as a dictionary. @retur

寻一解决方法实现c#获取apk文件版本信息

问题描述 最近有一个问题,要c#获取上传的apk的包名,版本号,版本名称,也用过很多方法,试过jar文件转dll,但是总遇到莫名的错误,希望能有个做过这方面的人指点一下..... 解决方案 解决方案二:APK是个压缩包格式吧,解压下,里面应该有个AndroidManifest.xml解析这个就可以了解决方案三:知道有个AndroidManifest.xml,但是有具体的代码么,我邮箱306706769@qq.com解决方案四:去网上下个SharpZip,自己搜搜教程.这个XML,不知道什么编码格

【转载】JS获取浏览器版本信息

document.write("js获取到的浏览器版本信息:"); document.write("<br />"); document.write("Browser: "); document.write(navigator.appName + ""); document.write("<br />"); document.write("Browserversion: &

Delphi实现动态获取版本信息

文件版本信息的存在使得应用程序正确的安装文件变得简单,并且使安装程序能够分析文件的当前安装状态.通常,版本信息应该包括文件的版本号.文件功能描述以及文件作者等多项重要内容. 在应用层面上,程序员可以通过保存在应用程序文件或动态链接库文件中的版本信息判断一个文件是否应该被安装,并确定当前安装文件的冲突.在文件有了版本信息这个属性后,我们编写的程序就能够实现以下功能: 1. 避免在新版本的组件上安装旧版本的相同组件: 2. 在多语言系统环境中,操作系统根据文件版本信息里提供的语言信息在启动程序时决定

jQuery获取浏览器的名称与版本信息

在jQuery中,通过$.browser对象可以获取浏览器的名称和版本信息,如$.browser.chrome为true,表示当前为Chrome浏览器,$.browser.mozilla为true,表示当前为火狐浏览器,还可以通过$.browser.version方式获取浏览器版本信息. <div id="divtest">             <div class="title">                 <span cl

如何获取php、mysql和apche的版本信息

直接获取PHP的版本 <?php echo "PHP软件版本:".phpversion(); ?> 直接获取MYSQL版本 <?php mysql_connect('127.0.0.1','root',''); echo mysql_get_server_info(); ?> 直接获取Apache版本 <?php $version=apache_get_version(); echo "$version"; ?> 以上是小编为您精

PHP获取php,mysql,apche的版本信息示例代码

 下面为大家介绍个不错的示例可以直接获取PHP.MYSQL.Apache的版本信息,需要的朋友可以参考下 直接获取PHP的版本  代码如下: <?php  echo "PHP软件版本:".phpversion();  ?>    直接获取MYSQL版本  代码如下: <?php  mysql_connect('127.0.0.1','root','');  echo mysql_get_server_info();  ?>    直接获取Apache版本   代