/******************************************************************************* 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 *******************************************************************************/