Introduction
There are many cases, when version information extracted from a file's version
resource could be useful. One example is to test for needed DLL versions. Another one is to simply use the version information from an application to display it in the
about-dialog of the application. If your application contains more than one language
resources, changing the version number becomes a boring task if you have to change the version label in each
about-dialog. Using CFileVersionInfo
you could simply read the version dynamically during runtime and insert it into the dialog. So you only will have to change the version
resource when the version number of your application has changed.
Using CFileVersionInfo
Using the class CFileVersionInfo
is very easy. Simply construct an object, call the Create()
method to initialize the object with a file's version information and call the attribute operations to retrieve the required information.
The following short example writes the application's version information to stdout
:
CFileVersionInfo fvi;
if (fvi.Create())
{
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 - Reference
Most of the methods are self-explanatory. Here are the references for the methods expected parameters:
Create
Initializes the object.
Syntax
BOOL Create(HMODULE hModule = NULL);
BOOL Create(LPCTSTR lpszFileName);
Parameters
hModule
- Module handle of the module, from which version information should be extracted.
Specifying NULL creates an object that uses the version information of the module used to create the calling process.
lpszFileName
- Full path to the file, from which version information should be extracted.
Return Value
Returns TRUE
if the version information has been extracted successfully and FALSE
otherwise.
GetFileVersion
Retrieves binary file version.
Syntax
WORD GetFileVersion(int nIndex) const;
Parameters
nIndex
- Byte of the file version to return. 0 specifies the least significant and 3 the most significant byte.
GetProductVersion
Returns the binary product version.
Syntax
WORD GetProductVersion(int nIndex) const;
Parameters
nIndex
- Byte of the file version to return. 0 specifies the least significant and 3 the most significant byte.
Requirements
This should run on Windows 95 or later and Windows NT 3.1 or later.
You will need to link your software with version.lib.
Unicode support
Though I haven't tested it, there is no reason, why this should not work with
Unicode.
Implementation Details
The class simply uses the following Windows' "File Installation Library Functions" for retrieving the version information:
GetFileVersionInfo()
GetFileVersioninfoSize()
VerQueryValue
Retrieving the strings of the version information is a little bit tricky. Different from other
resource's, where Windows chooses the language that best fits the user's preferences, for the version
resource the developer is responsible for choosing the best matching language.
The datablock returned by GetFileVersionInfo()
(lpData
) contains a list of all language-codepage-combinations included in the datablock. One can receive this list using the following sequence:
LPVOID lpInfo;
UINT unInfoLen;
VerQueryValue(lpData, _T("\\"), &lpInfo, &unInfoLen);
VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &lpInfo, &unInfoLen);
CFileVersionInfo
uses the following tests to get the best matching strings:
- Checks if version information is available that matches the user's main and sub language.
- Checks if version information is available that matches the user's main language.
- Checks if version information marked as "neutral" (
LANG_NEUTRAL
) is available.
- Checks if version information in English language (
LANG_ENGLISH
) is available.
- Uses the first language from the language list.
The first matching language is used. The users's main and sub language are retrieved by using the GetUserDefaultLangID()
function.
Revision History
19 Jun 2002 - Initial Revision
19 Jun 2002 - Reformatted and rewrote some sections