65.9K
CodeProject 正在变化。 阅读更多。
Home

CFileVersionInfo - 检索文件的完整版本信息资源

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.98/5 (31投票s)

2001年10月27日

3分钟阅读

viewsIcon

210584

downloadIcon

3848

一个使您可以轻松检索文件版本信息的类。

引言

在很多情况下,从文件的版本资源中提取的版本信息可能很有用。一个例子是测试所需的 DLL 版本。另一个例子是简单地使用应用程序的版本信息将其显示在应用程序的关于对话框中。如果您的应用程序包含多个语言资源,如果您必须更改每个关于对话框中的版本标签,则更改版本号会变得很无聊。使用 CFileVersionInfo,您可以简单地在运行时动态读取版本并将其插入到对话框中。因此,您只需在应用程序的版本号发生更改时更改版本资源。

使用 CFileVersionInfo

使用类 CFileVersionInfo 非常容易。只需构造一个对象,调用 Create() 方法来使用文件的版本信息初始化该对象,然后调用属性操作来检索所需的信息。

以下简短示例将应用程序的版本信息写入 stdout

CFileVersionInfo  fvi;

// Retrieve version information for this module
if (fvi.Create())
{
    // Print version information
    cout
    << _T("Product: ") <<fvi.GetProductName()
    << _T("\n") << _T("Company: ")
    << fvi.GetCompanyName() << _T("\n")
    << _T("File Version Label: ")
    << fvi.GetFileVersion() << _T("\n")
    << _T("File Version Number: ")
    << fvi.GetFileVersion(3) << _T('.')
    << fvi.GetFileVersion(2) << _T('.')
    << fvi.GetFileVersion(1) << _T('.')
    << fvi.GetFileVersion(0);
}

CFileVersionInfo - 参考

大多数方法都是不言自明的。以下是这些方法预期参数的参考

Create

初始化对象。

语法

BOOL Create(HMODULE hModule = NULL);
BOOL Create(LPCTSTR lpszFileName);

参数

hModule
从中提取版本信息的模块的模块句柄。指定 NULL 会创建一个使用用于创建调用进程的模块的版本信息的对象。
lpszFileName
要从中提取版本信息的文件的完整路径。

返回值

如果版本信息已成功提取,则返回 TRUE,否则返回 FALSE

GetFileVersion

检索二进制文件版本。

语法

WORD GetFileVersion(int nIndex) const;

参数

nIndex
要返回的文件版本的字节。0 指定最低有效字节,3 指定最高有效字节。

GetProductVersion

返回二进制产品版本。

语法

WORD GetProductVersion(int nIndex) const;

参数

nIndex
要返回的文件版本的字节。0 指定最低有效字节,3 指定最高有效字节。

要求

这应该在 Windows 95 或更高版本以及 Windows NT 3.1 或更高版本上运行。

您需要将您的软件与 *version.lib* 链接。

Unicode 支持

虽然我没有测试过,但没有理由不支持 Unicode。

实现细节

该类只是使用以下 Windows 的“文件安装库函数”来检索版本信息

  • GetFileVersionInfo()
  • GetFileVersioninfoSize()
  • VerQueryValue

检索版本信息的字符串有点棘手。与其他资源不同,Windows 会选择最适合用户首选项的语言,对于版本资源,开发人员负责选择最佳匹配的语言。

GetFileVersionInfo() (lpData) 返回的数据块包含数据块中包含的所有语言-代码页组合的列表。可以使用以下序列接收此列表

LPVOID   lpInfo;
UINT      unInfoLen;
VerQueryValue(lpData, _T("\\"), &lpInfo, &unInfoLen);
VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &lpInfo, &unInfoLen);

CFileVersionInfo 使用以下测试来获得最佳匹配的字符串

  1. 检查是否存在与用户的主要和子语言匹配的版本信息。
  2. 检查是否存在与用户的主要语言匹配的版本信息。
  3. 检查是否有标记为“中性” (LANG_NEUTRAL) 的版本信息可用。
  4. 检查是否有英语 (LANG_ENGLISH) 的版本信息可用。
  5. 使用语言列表中的第一种语言。

使用第一个匹配的语言。用户的主要和子语言通过使用 GetUserDefaultLangID() 函数检索。

修订历史

2002年6月19日 - 初始修订版
2002 年 6 月 19 日 - 重新格式化并重写了一些部分

CFileVersionInfo - 检索文件的完整版本信息资源 - CodeProject - 代码之家
© . All rights reserved.