// MiniVersion.cpp Version 1.1 // // Author: Hans Dietrich // hdietrich2@hotmail.com // // This software is released into the public domain. // You are free to use it in any way you like, except // that you may not sell this source code. // // This software is provided "as is" with no expressed // or implied warranty. I accept no liability for any // damage or loss of business that this software may cause. // /////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MiniVersion.h" #pragma message("automatic link to VERSION.LIB") #pragma comment(lib, "version.lib") /////////////////////////////////////////////////////////////////////////////// // ctor CMiniVersion::CMiniVersion(LPCTSTR lpszPath) { ZeroMemory(m_szPath, sizeof(m_szPath)); if (lpszPath && lpszPath[0] != 0) { lstrcpyn(m_szPath, lpszPath, sizeof(m_szPath)-1); } else { } m_pData = NULL; m_dwHandle = 0; for (int i = 0; i < 4; i++) { m_wFileVersion[i] = 0; m_wProductVersion[i] = 0; } m_dwFileFlags = 0; m_dwFileOS = 0; m_dwFileType = 0; m_dwFileSubtype = 0; ZeroMemory(m_szCompanyName, sizeof(m_szCompanyName)); ZeroMemory(m_szProductName, sizeof(m_szProductName)); ZeroMemory(m_szFileDescription, sizeof(m_szFileDescription)); Init(); } /////////////////////////////////////////////////////////////////////////////// // Init BOOL CMiniVersion::Init() { DWORD dwHandle; DWORD dwSize; BOOL rc; dwSize = ::GetFileVersionInfoSize(const_cast<LPTSTR>(m_szPath), &dwHandle); if (dwSize == 0) return FALSE; m_pData = new BYTE [dwSize + 1]; ZeroMemory(m_pData, dwSize+1); rc = ::GetFileVersionInfo(const_cast<LPTSTR>(m_szPath), dwHandle, dwSize, m_pData); if (!rc) return FALSE; // get fixed info VS_FIXEDFILEINFO FixedInfo; if (GetFixedInfo(FixedInfo)) { m_wFileVersion[0] = HIWORD(FixedInfo.dwFileVersionMS); m_wFileVersion[1] = LOWORD(FixedInfo.dwFileVersionMS); m_wFileVersion[2] = HIWORD(FixedInfo.dwFileVersionLS); m_wFileVersion[3] = LOWORD(FixedInfo.dwFileVersionLS); m_wProductVersion[0] = HIWORD(FixedInfo.dwProductVersionMS); m_wProductVersion[1] = LOWORD(FixedInfo.dwProductVersionMS); m_wProductVersion[2] = HIWORD(FixedInfo.dwProductVersionLS); m_wProductVersion[3] = LOWORD(FixedInfo.dwProductVersionLS); m_dwFileFlags = FixedInfo.dwFileFlags; m_dwFileOS = FixedInfo.dwFileOS; m_dwFileType = FixedInfo.dwFileType; m_dwFileSubtype = FixedInfo.dwFileSubtype; } else return FALSE; // get string info GetStringInfo(_T("CompanyName"), m_szCompanyName); GetStringInfo(_T("FileDescription"), m_szFileDescription); GetStringInfo(_T("ProductName"), m_szProductName); return TRUE; } /////////////////////////////////////////////////////////////////////////////// // Release void CMiniVersion::Release() { // do this manually, because we can't use objects requiring // a dtor within an exception handler if (m_pData) delete [] m_pData; m_pData = NULL; } /////////////////////////////////////////////////////////////////////////////// // GetFileVersion BOOL CMiniVersion::GetFileVersion(WORD * pwVersion) { for (int i = 0; i < 4; i++) *pwVersion++ = m_wFileVersion[i]; return TRUE; } /////////////////////////////////////////////////////////////////////////////// // GetProductVersion BOOL CMiniVersion::GetProductVersion(WORD * pwVersion) { for (int i = 0; i < 4; i++) *pwVersion++ = m_wProductVersion[i]; return TRUE; } /////////////////////////////////////////////////////////////////////////////// // GetFileFlags BOOL CMiniVersion::GetFileFlags(DWORD& rdwFlags) { rdwFlags = m_dwFileFlags; return TRUE; } /////////////////////////////////////////////////////////////////////////////// // GetFileOS BOOL CMiniVersion::GetFileOS(DWORD& rdwOS) { rdwOS = m_dwFileOS; return TRUE; } /////////////////////////////////////////////////////////////////////////////// // GetFileType BOOL CMiniVersion::GetFileType(DWORD& rdwType) { rdwType = m_dwFileType; return TRUE; } /////////////////////////////////////////////////////////////////////////////// // GetFileSubtype BOOL CMiniVersion::GetFileSubtype(DWORD& rdwType) { rdwType = m_dwFileSubtype; return TRUE; } /////////////////////////////////////////////////////////////////////////////// // GetCompanyName BOOL CMiniVersion::GetCompanyName(LPTSTR lpszCompanyName, int nSize) { if (!lpszCompanyName) return FALSE; ZeroMemory(lpszCompanyName, nSize); lstrcpyn(lpszCompanyName, m_szCompanyName, nSize-1); return TRUE; } /////////////////////////////////////////////////////////////////////////////// // GetFileDescription BOOL CMiniVersion::GetFileDescription(LPTSTR lpszFileDescription, int nSize) { if (!lpszFileDescription) return FALSE; ZeroMemory(lpszFileDescription, nSize); lstrcpyn(lpszFileDescription, m_szFileDescription, nSize-1); return TRUE; } /////////////////////////////////////////////////////////////////////////////// // GetProductName BOOL CMiniVersion::GetProductName(LPTSTR lpszProductName, int nSize) { if (!lpszProductName) return FALSE; ZeroMemory(lpszProductName, nSize); lstrcpyn(lpszProductName, m_szProductName, nSize-1); return TRUE; } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // protected methods // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // GetFixedInfo BOOL CMiniVersion::GetFixedInfo(VS_FIXEDFILEINFO& rFixedInfo) { BOOL rc; UINT nLength; VS_FIXEDFILEINFO *pFixedInfo = NULL; if (!m_pData) return FALSE; if (m_pData) rc = ::VerQueryValue(m_pData, _T("\\"), (void **) &pFixedInfo, &nLength); else rc = FALSE; if (rc) memcpy (&rFixedInfo, pFixedInfo, sizeof (VS_FIXEDFILEINFO)); return rc; } /////////////////////////////////////////////////////////////////////////////// // GetStringInfo BOOL CMiniVersion::GetStringInfo(LPCTSTR lpszKey, LPTSTR lpszReturnValue) { BOOL rc; DWORD *pdwTranslation; UINT nLength; LPTSTR lpszValue; if (m_pData == NULL) return FALSE; if (!lpszReturnValue) return FALSE; if (!lpszKey) return FALSE; *lpszReturnValue = 0; rc = ::VerQueryValue(m_pData, _T("\\VarFileInfo\\Translation"), (void**) &pdwTranslation, &nLength); if (!rc) return FALSE; TCHAR szKey[2000]; wsprintf(szKey, _T("\\StringFileInfo\\%04x%04x\\%s"), LOWORD (*pdwTranslation), HIWORD (*pdwTranslation), lpszKey); rc = ::VerQueryValue(m_pData, szKey, (void**) &lpszValue, &nLength); if (!rc) return FALSE; lstrcpy(lpszReturnValue, lpszValue); return TRUE; }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 16169 | perforce_software | Move files to follow new path scheme for branches. | ||
//guest/perforce_software/p4win/common/MiniVersion.cpp | |||||
#1 | 8562 | Matt Attaway |
These feet never stop running. Initial commit of the P4Win source code. To the best of our knowledge this compiles and runs using the 2013.3 P4 API and VS 2010. Expect a few changes as we refine the build process. Please post any build issues to the forums. |