www.pudn.com > ÓïÒôºÏ³ÉÈí¼þ£¬º¬FreephoneºÍMbroraÁ½¸öÄ£¿é.zip > version.cpp


// 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 "stdafx.h" 
#include "version.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\\"); 
			if (strLangID!=NULL) 
			{ 
				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); 
	} 
} 
 
void CVersionInfo::SetVersionToMajMin(int type) 
{ 
	CString temp; 
	if (type) 
		temp=m_strFixedProductVersion; 
	else 
		temp=m_strFixedFileVersion; 
	int pos=temp.Find(","); 
	m_strVersionInfo=temp.Left(pos)+"."; 
	temp=temp.Mid(pos+1); 
	// Minor 1 version extraction 
	pos=temp.Find(","); 
	m_strVersionInfo+=temp.Left(pos); 
	temp=temp.Mid(pos+1); 
	// Minor 2 version extraction 
	pos=temp.Find(","); 
	m_strVersionInfo+=temp.Left(pos); 
}