/*******************************************************************************
FILE: version.cpp
*******************************************************************************/
#include "stdafx.h"
#include "version.h"
CVersionInfo::CVersionInfo(LPCSTR szFileToVersion /* = NULL*/,
LPCSTR szLanguage /* = "0409"*/,
LPCSTR szCodepage /* = "04e4"*/)
{
m_lpstrVffInfo = NULL;
m_strFileName = szFileToVersion;
m_strLanguage = szLanguage;
m_strCodepage = szCodepage;
m_strCompanyName = _T("");
m_strFileDescription = _T("");
m_strFileVersion = _T("");
m_strInternalName = _T("");
m_strLegalCopyright = _T("");
m_strOriginalFilename = _T("");
m_strProductName = _T("");
m_strProductVersion = _T("");
m_strComments = _T("");
m_strSpecialBuild = _T("");
m_strPrivateBuild = _T("");
m_bQueryDone=FALSE;
}
CString CVersionInfo::GetFileVersion()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strFileVersion;
}
CString CVersionInfo::GetPrivateBuild()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strPrivateBuild;
}
CString CVersionInfo::GetSpecialBuild()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strSpecialBuild;
}
CString CVersionInfo::GetCompanyName()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strCompanyName;
}
CString CVersionInfo::GetFileDescription()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strFileDescription;
}
CString CVersionInfo::GetInternalName()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strInternalName;
}
CString CVersionInfo::GetLegalCopyright()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strLegalCopyright;
}
CString CVersionInfo::GetOriginalFilename()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strOriginalFilename;
}
CString CVersionInfo::GetProductVersion()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strProductVersion;
}
CString CVersionInfo::GetComments()
{
if (!m_bQueryDone)
GetVersionInfo();
return m_strComments;
}
void CVersionInfo::GetVersionInfo()
{
DWORD dwVerInfoSize; // Size of version information block
DWORD dwVerHnd=0; // An 'ignored' parameter, always '0'
char szFileName[MAX_PATH];
m_bQueryDone=TRUE;
if (m_strFileName.IsEmpty())
GetModuleFileName(NULL, szFileName, MAX_PATH);
else
lstrcpy(szFileName, m_strFileName);
dwVerInfoSize = GetFileVersionInfoSize(szFileName, &dwVerHnd);
if (dwVerInfoSize) {
HANDLE hMem;
hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
m_lpstrVffInfo = (char *)GlobalLock(hMem);
GetFileVersionInfo(szFileName, dwVerHnd, dwVerInfoSize, m_lpstrVffInfo);
QueryValue("CompanyName", m_strCompanyName);
QueryValue("FileDescription", m_strFileDescription);
QueryValue("FileVersion", m_strFileVersion);
QueryValue("InternalName", m_strInternalName);
QueryValue("LegalCopyright", m_strLegalCopyright);
QueryValue("OriginalFilename", m_strOriginalFilename);
QueryValue("ProductName", m_strProductName);
QueryValue("ProductVersion", m_strProductVersion);
QueryValue("Comments", m_strComments);
QueryValue("SpecialBuild", m_strSpecialBuild);
QueryValue("PrivateBuild", m_strPrivateBuild);
GlobalUnlock(hMem);
GlobalFree(hMem);
}
}
void CVersionInfo::QueryValue(LPCSTR szId, CString& s)
{
ASSERT(m_lpstrVffInfo != NULL);
LPSTR lpVersion; // String pointer to 'version' text
UINT uVersionLen;
BOOL bRetCode;
char szSelector[256];
wsprintf(szSelector,"\\StringFileInfo\\%s%s\\%s",
m_strLanguage, m_strCodepage, szId);
bRetCode = VerQueryValue((LPVOID)m_lpstrVffInfo,
TEXT(szSelector),
(LPVOID *)&lpVersion,
&uVersionLen);
if(bRetCode)
s = lpVersion;
else
s.Empty();
}
/*******************************************************************************
END OF FILE
*******************************************************************************/