FileVersion - 检索文件版本信息






4.89/5 (13投票s)
轻松确定指定文件的版本或当前进程的版本。
引言
获取文件的版本信息在许多情况下都很有用。也许您想在加载库之前检查其版本,以确保不加载旧版本,这可能导致意外的软件行为。或者您只是想在“关于”对话框中显示应用程序的当前版本。这个类允许您以非常简单的方式做到这一点。
背景
我将开发一个应用程序,用于检测重复库的问题。如果由于“库搜索顺序”而加载了旧库而不是新库,它应该通知我。这个类为我提供了基本要求,例如确定或比较文件版本。
CodeProject 上已经有类似的的文章。我开发了自己的类,以获得一种轻量级的方式来确定文件版本,而无需存储其他信息,例如公司名称、描述等。
使用代码
以下示例演示了如何使用这个类。
获取当前进程的版本
CString strFileVersion;
FileVersion cFileVersion;
// Get formated file version
cFileVersion.GetFileVersion( L"Version: %i.%i", strFileVersion );
有助于保持您的“关于”对话框的最新状态
获取指定文件的版本
CString strFileVersion;
FileVersion cFileVersion( L"C:\\Windows\\System32\\NativeHooks.dll" );
// Get file version
cFileVersion.GetFileVersion( strFileVersion );
MessageBox( strFileVersion );
输出
比较文件版本
// 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 编译。