// 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 | 19924 | YourUncleBob |
Populate -o //guest/perforce_software/p4win/... //guest/YourUncleBob/p4win/..... |
||
| //guest/perforce_software/p4win/main/common/MiniVersion.cpp | |||||
| #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. |
||