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

FileVersion - 检索文件版本信息

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (13投票s)

2010年5月5日

CPOL

2分钟阅读

viewsIcon

53486

downloadIcon

954

轻松确定指定文件的版本或当前进程的版本。

引言

获取文件的版本信息在许多情况下都很有用。也许您想在加载库之前检查其版本,以确保不加载旧版本,这可能导致意外的软件行为。或者您只是想在“关于”对话框中显示应用程序的当前版本。这个类允许您以非常简单的方式做到这一点。

背景

我将开发一个应用程序,用于检测重复库的问题。如果由于“库搜索顺序”而加载了旧库而不是新库,它应该通知我。这个类为我提供了基本要求,例如确定或比较文件版本。

CodeProject 上已经有类似的的文章。我开发了自己的类,以获得一种轻量级的方式来确定文件版本,而无需存储其他信息,例如公司名称、描述等。

使用代码

以下示例演示了如何使用这个类。

获取当前进程的版本

CString        strFileVersion;
FileVersion    cFileVersion;

// Get formated file version
cFileVersion.GetFileVersion( L"Version: %i.%i", strFileVersion );

有助于保持您的“关于”对话框的最新状态

About Box

获取指定文件的版本

CString        strFileVersion;
FileVersion    cFileVersion( L"C:\\Windows\\System32\\NativeHooks.dll" );

// Get file version
cFileVersion.GetFileVersion( strFileVersion );

MessageBox( strFileVersion );

输出

File version of NativeHooks.dll

比较文件版本

// Version is 6.1.7600.16385
FileVersion    cFileVersionNativeHooks( L"C:\\Windows\\System32\\NativeHooks.dll" );

// Version is 12.0.7600.16385
FileVersion    cFileVersionWmerror( L"C:\\Windows\\System32\\wmerror.dll" );

// Compare versions
bool bIsGreater =  ( cFileVersionNativeHooks > cFileVersionWmerror );  // false
bool bIsLess    =  ( cFileVersionNativeHooks < cFileVersionWmerror );  // true
bool bIsEqual    =  ( cFileVersionNativeHooks == cFileVersionWmerror ); // false

接口

构造函数

  • explicit FileVersion( const TCHAR * kstrFilePath ):创建指定文件的 FileVersion
  • FileVersion() 创建当前进程的 FileVersion

方法

  • bool IsValid() const:返回是否可以确定文件版本。
  • unsigned short GetMajorVersion() const:返回主版本号。
  • unsigned short GetMinorVersion() const:返回次版本号。
  • unsigned short GetReleaseNumber() const:返回发布号。
  • unsigned short GetBuildNumber() const:返回构建号。
  • bool GetFileVersion( const TCHAR* kstrFileFormat, CString& strFileVersion ) const:获取文件版本字符串。顺序为主要、次要、发布和构建号。字符串可以格式化;例如,L"Version: %i.%i.%i.%i" 将返回类似于“Version: 12.1.0.530”的字符串。
  • bool GetFileVersion( CString& strFileVersion ) const:获取文件版本字符串。顺序为主要、次要、发布和构建号,中间用点分隔。例如:“12.1.0.530”。
  • bool IsEqual( const FileVersion & krhs ) const:如果文件版本等于传递的文件版本,则返回 true

操作

  • bool operator<( const FileVersion & krhs ) const:如果文件版本小于传递的文件版本,则返回 true
  • bool operator>( const FileVersion & krhs ) const:如果文件版本大于传递的文件版本,则返回 true
  • bool operator==( const FileVersion & krhs ) const:如果文件版本等于传递的文件版本,则返回 true

实现细节

这是确定文件版本的方式

bool FileVersion::DetermineFileVersion( const TCHAR* kstrFilePath )
{
    // Precondition
    if ( NULL == kstrFilePath )
        return false; // FilePath is empty, no file to determine version.

    DWORD    dwHandle;

    // Determines whether the operating system can retrieve version information
    // for a specified file.
    DWORD    dwFileVersionInfoSize = 
        GetFileVersionInfoSize( kstrFilePath, &dwHandle );

    if ( NULL == dwFileVersionInfoSize )
        return false;    // Can't retrieve version information size.

    // Allocate space to retrieve version information using vector to prevent
    // memory leaks
    std::vector<BYTE>    pData( dwFileVersionInfoSize );

    // Retrieves version information for the specified file.
    if ( false == GetFileVersionInfo( kstrFilePath
        , dwHandle
        , dwFileVersionInfoSize
        , static_cast<lpvoid>( &pData[0] ) ) )
        return false; // Can't retrieve version information.

    // The memory of ptFileInfo is freed when pData is freed.
    VS_FIXEDFILEINFO *ptFileInfo;
    UINT    uintSize;

    // Retrieves version information from the version-information resource
    if ( false == VerQueryValue( static_cast<lpvoid>( &pData[0] )
        , _T("\\")
        , reinterpret_cast<lpvoid*> ( &ptFileInfo )
        , &uintSize ) )
        return false; // Can't retrieve version information

    // Resolve major, minor, release and build number.
    musMajorVersion        = static_cast<unsigned>(  
        ( ptFileInfo->dwFileVersionMS >> 16 ) &0xffff );

    musMinorVersion        = static_cast<unsigned>( 
        ptFileInfo->dwFileVersionMS &0xffff );

    musReleaseNumber    = static_cast<unsigned>( 
        ( ptFileInfo->dwFileVersionLS >> 16 ) &0xffff);

    musBuildNumber        = static_cast<unsigned>( 
        ptFileInfo->dwFileVersionLS & 0xffff );

    return true;
}

注释

这个类在警告级别 4 下使用 UNICODE 和 ANSI 编译。

© . All rights reserved.