CVersionInfo is a tiny class, which wraps the stuff needed to get the version info from a resource file. It handles both, the fixed version information and the language dependent string version information of the resource file. It contains three CString members which hold the retrieved information:
m_strFixedFileVersion: the fixed file version info (language independent)
m_strFixedProductVersion: the fixed product version info (language independent)
m_strVersionInfo: the desired version info string (language dependent)
To get the language dependent string version info you need to set the following parameters as follows:
strLangID:
strLangID is the language ID for which the version info is desired
040904E4 means e.g.:
04—— = SUBLANG_ENGLISH_USA
–09—- = LANG_ENGLISH
—-04E4 = 1252 = Codepage for Windows:Multilingual
strInfoType:
strInfoType is the desired version entry, eg.:”ProductName”, or “ProductVersion”
hModule:
hModule ist the Instance handle of the module for which the version info should be retrieved
with EXE’s: Get hModule calling AfxGetInstanceHandle.
with DLL’s: Get hModule calling ::GetModuleHandle (“DLLName”), where “DLLName” is the Name of the module
Important!
CVersionInfo requires to be linked with VERSION.LIB!Here’s the code:
// VersionInfo.h
#ifndef VERSIONINFO_H
#define VERSIONINFO_H
#include “stdafx.h”
class CVersionInfo
{
public:
CString m_strVersionInfo;
CString m_strFixedFileVersion;
CString m_strFixedProductVersion;
CVersionInfo ();
~CVersionInfo ();
CVersionInfo (HMODULE hModule, LPCTSTR strLangID = NULL, LPCTSTR strInfoType = NULL);
CVersionInfo (LPTSTR szFilename, LPCTSTR strLangID = NULL, LPCTSTR strInfoType = NULL);
void GetVersionInfo (LPTSTR szFilename, LPCTSTR strLangID = NULL, LPCTSTR strInfoType = NULL);
void GetVersionInfo (HMODULE hModule, LPCTSTR strLangID = NULL, LPCTSTR strInfoType = NULL);
};#endif // VERSIONINFO_H
// VersionInfo.cpp
//**********************************************************************************************
// CVersionInfo (c)1997 Roberto Rocco
//———————————————————————————————-
// CVersionInfo is a tiny class, which wraps the stuff needed to get the version info from a
// resource file.
// It handles both, the fixed version information and the language dependent string version
// information of the resource file.
//
// It contains three CString members which hold the retrieved information:
// m_strFixedFileVersion: the fixed file version info (language independent)
// m_strFixedProductVersion: the fixed product version info (language independent)
// m_strVersionInfo: the desired version info string (language dependent)
//
// CVersionInfo requires to be linked with VERSION.LIB!
//
//**********************************************************************************************
#include “VersionInfo.h”
// Standard-Constructor. Does nothing particular
CVersionInfo::CVersionInfo ()
{
}// Standard-Destructor. Does nothing particular
CVersionInfo::~CVersionInfo ()
{
}// Constructor with hModule, strLangId and strInfoType as parameter
CVersionInfo::CVersionInfo (HMODULE hModule, LPCTSTR strLangID/*=NULL*
, LPCTSTR strInfoType/*=NULL*
)
{
GetVersionInfo (hModule, strLangID, strInfoType);
}
// Constructor with szFilename, strLangId and strInfoType as parameter
CVersionInfo::CVersionInfo (LPTSTR szFilename, LPCTSTR strLangID/*=NULL*
, LPCTSTR strInfoType/*=NULL*
)
{
GetVersionInfo (szFilename, strLangID, strInfoType);
}void CVersionInfo::GetVersionInfo (HMODULE hModule, LPCTSTR strLangID/*=NULL*
, LPCTSTR strInfoType/*=NULL*
)
{
TCHAR szExeName[MAX_PATH];
if(hModule == NULL)
return;
GetModuleFileName(hModule, szExeName, sizeof (szExeName));
GetVersionInfo(szExeName, strLangID, strInfoType);
}//**********************************************************************************************
// GetVersionInfo (requires VERSION.LIB!!!)
//———————————————————————————————-
// Retrieves the desired version entry from the VERSIONINFO structure of the resource file.
//
// strLangID is the language ID for which the version info is desired
// 040904E4 means e.g.:
// 04—— = SUBLANG_ENGLISH_USA
// –09—- = LANG_ENGLISH
// —-04E4 = 1252 = Codepage for Windows:Multilingual
//
// strInfoType is the desired version entry, eg.:”ProductName”, or “ProductVersion”
//
// hModule ist the Instance handle of the module for which the version info should be retrieved
// with EXE’s: Get hModule calling AfxGetInstanceHandle.
// with DLL’s: Get hModule calling ::GetModuleHandle (“DLLName”), where “DLLName” is the Name of the module
//
// the version information is stored in the member variables:
// m_strFixedFileVersion, m_strFixedProductVersion and m_strVersionInfo, where:
// m_strFixedFileVersion and m_strFixedProductVersion contain the fixed version info (language independent) and
// m_strVersionInfo contains the desired version info string (language dependent)
//
//**********************************************************************************************
void CVersionInfo::GetVersionInfo (LPTSTR szFilename, LPCTSTR strLangID/*=NULL*
, LPCTSTR strInfoType/*=NULL*
)
{
DWORD dwVerInfoSize;
DWORD dwHnd;
void* pBuffer;
VS_FIXEDFILEINFO *pFixedInfo; // pointer to fixed file info structure
LPVOID lpVersion; // String pointer to ‘version’ text
UINT uVersionLen; // Current length of full version string
TCHAR szGetName[500];
dwVerInfoSize = GetFileVersionInfoSize(szFilename, &dwHnd);
if (dwVerInfoSize)
{
pBuffer = malloc(dwVerInfoSize);
if (pBuffer == NULL)
return;
GetFileVersionInfo(szFilename, dwHnd, dwVerInfoSize, pBuffer);
// get the fixed file info (language-independend)
VerQueryValue(pBuffer,_T(“”),(void**)&pFixedInfo,(UINT *)&uVersionLen);
m_strFixedProductVersion.Format (“%u,%u,%u,%u”, HIWORD (pFixedInfo->dwProductVersionMS),
LOWORD (pFixedInfo->dwProductVersionMS),
HIWORD (pFixedInfo->dwProductVersionLS),
LOWORD (pFixedInfo->dwProductVersionLS));
m_strFixedFileVersion.Format (“%u,%u,%u,%u”,HIWORD (pFixedInfo->dwFileVersionMS),
LOWORD (pFixedInfo->dwFileVersionMS),
HIWORD (pFixedInfo->dwFileVersionLS),
LOWORD (pFixedInfo->dwFileVersionLS));
// get the string file info (language-dependend)
if (strLangID != NULL || strInfoType != NULL)
{
lstrcpy(szGetName, “StringFileInfo”);
lstrcat (szGetName, strLangID);
lstrcat (szGetName, “”);
lstrcat (szGetName, strInfoType);
// copy version info, if desired entry exists
if (VerQueryValue(pBuffer,szGetName,(void**)&lpVersion,(UINT *)&uVersionLen) != 0)
m_strVersionInfo = (LPTSTR)lpVersion;
}
if (pBuffer != NULL)
free(pBuffer);
}
}