Click here to Skip to main content
13,505,219 members
Click here to Skip to main content
Add your own
alternative version


68 bookmarked
Posted 26 Oct 2001

CFileVersionInfo - Retrieving a File's full Version Information Resource

, 18 Jun 2002
Rate this:
Please Sign up or sign in to vote.
A class that enables you to easily retrieve a file's version information.
<!-- Download Links --> <!-- Add the rest of your HTML here -->


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;

// Retrieve version information for this module
if (fvi.Create())
    // Print version information
    << _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:


Initializes the object.


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


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.
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.


Retrieves binary file version.


WORD GetFileVersion(int nIndex) const;


Byte of the file version to return. 0 specifies the least significant and 3 the most significant byte.


Returns the binary product version.


WORD GetProductVersion(int nIndex) const;


Byte of the file version to return. 0 specifies the least significant and 3 the most significant byte.


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:

  1. Checks if version information is available that matches the user's main and sub language.
  2. Checks if version information is available that matches the user's main language.
  3. Checks if version information marked as "neutral" (LANG_NEUTRAL) is available.
  4. Checks if version information in English language (LANG_ENGLISH) is available.
  5. 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


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Sven Wiegand
Web Developer
Germany Germany
Sven Wiegand (1976), IT professional living in Berlin (Germany), develops open source software in his free time. His most successfull project is the LaTeX IDE TeXnicCenter which is distributed under the terms of the GNU-GPL and has more than 100,000 users all about the world.

"The picture shows me with my racing bike on the top of the Roque de los Muchachos (2426m) - the highest point of the canarian island La Palma."

You may also be interested in...

Comments and Discussions

GeneralExcellent Pin
waldermort13-Aug-06 12:33
memberwaldermort13-Aug-06 12:33 
GeneralA tip for Version.lib Pin
fader000313-Jul-06 9:29
memberfader000313-Jul-06 9:29 
GeneralVisual Studio .Net Pin
Lea Robbo1-Mar-06 22:20
memberLea Robbo1-Mar-06 22:20 
GeneralFor linking to version.lib...just a tip, and if u get inconsistent dll linakge errors Pin
brrrrrr1-Dec-05 17:36
memberbrrrrrr1-Dec-05 17:36 
GeneralRe: For linking to version.lib...just a tip, and if u get inconsistent dll linakge errors Pin
Pandele Florin29-May-07 3:34
memberPandele Florin29-May-07 3:34 
GeneralRe: For linking to version.lib...just a tip, and if u get inconsistent dll linakge errors Pin
typical user19-Feb-09 7:36
membertypical user19-Feb-09 7:36 
GeneralLINK : warning LNK4089: Pin
Lea Rob27-Jul-05 4:46
sussLea Rob27-Jul-05 4:46 
GeneralWarning if running from network Pin
JonathanMerel4-Apr-05 9:27
memberJonathanMerel4-Apr-05 9:27 
GeneralUSEFUL!! Pin
SamGw4-Feb-05 22:46
memberSamGw4-Feb-05 22:46 
GeneralShared Folder Path Pin
Fawad Asrar Qureshi19-Dec-04 20:55
memberFawad Asrar Qureshi19-Dec-04 20:55 
Generaluse on VC7 Pin
Knuddlbaer23-Nov-03 23:24
memberKnuddlbaer23-Nov-03 23:24 
GeneralRe: use on VC7 Pin
Rail Jon Rogut15-Jul-04 6:31
memberRail Jon Rogut15-Jul-04 6:31 
GeneralThanks Pin
Zorglab4-Aug-03 10:13
memberZorglab4-Aug-03 10:13 
GeneralUnresolved external Pin
Al Newton23-Jan-03 11:24
memberAl Newton23-Jan-03 11:24 
GeneralRe: Unresolved external Pin
Sven Wiegand23-Jan-03 21:21
memberSven Wiegand23-Jan-03 21:21 
GeneralThank you.... Pin
rollasoc29-Aug-02 6:28
sussrollasoc29-Aug-02 6:28 
Generalproblem with exe Pin
Anonymous28-Aug-02 7:46
sussAnonymous28-Aug-02 7:46 
GeneralRe: problem with exe Pin
Sven Wiegand28-Aug-02 21:24
memberSven Wiegand28-Aug-02 21:24 
GeneralRe: problem with exe Pin
Mindaugas Rupsys20-Oct-06 3:48
memberMindaugas Rupsys20-Oct-06 3:48 
GeneralRe: problem with exe Pin
Mass Nerder16-Nov-06 0:42
memberMass Nerder16-Nov-06 0:42 
GeneralRe: problem with exe Pin
Mindaugas Rupsys16-Nov-06 8:41
memberMindaugas Rupsys16-Nov-06 8:41 
QuestionAm I missing something? Pin
Mel23-Jun-02 22:48
memberMel23-Jun-02 22:48 
AnswerRe: Am I missing something? Pin
Sven Wiegand25-Jun-02 21:50
memberSven Wiegand25-Jun-02 21:50 
QuestionWhy use Create method? Pin
Tom Welch19-Dec-01 9:44
memberTom Welch19-Dec-01 9:44 
AnswerRe: Why use Create method? Pin
Sven Wiegand19-Dec-01 23:45
memberSven Wiegand19-Dec-01 23:45 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.180417.1 | Last Updated 19 Jun 2002
Article Copyright 2001 by Sven Wiegand
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid