|
// PSLModuleVersion.cpp : Implementation of CPSLModuleVersion
#include "stdafx.h"
#include "PSLModuleVersion.h"
CPSLModuleVersion::CPSLModuleVersion()
{
m_bValid = false;
m_bDebug = false;
m_bPatched = false;
m_bPreRelease = false;
m_pVersionBuffer = NULL;
m_bInitialized = false;
m_pProductVersion = NULL;
m_pFileVersion = NULL;
}
CPSLModuleVersion::~CPSLModuleVersion()
{
if(m_pVersionBuffer)
delete []m_pVersionBuffer;
}
HRESULT CPSLModuleVersion::FinalConstruct()
{
CComObject<CPSLVersionNumber>::CreateInstance(&m_pFileVersion);
m_pFileVersion->AddRef();
CComObject<CPSLVersionNumber>::CreateInstance(&m_pProductVersion);
m_pProductVersion->AddRef();
return S_OK;
}
void CPSLModuleVersion::FinalRelease()
{
m_pProductVersion->Release();
m_pFileVersion->Release();
}
void CPSLModuleVersion::InitInternal(LPCTSTR strPath)
{
// Internally, we need to attempt initialization only once;
if(!m_bInitialized)
{
m_bInitialized = true;
InitExternal(strPath);
}
}
bool CPSLModuleVersion::InitExternal(LPCTSTR strPath)
{
if(m_pVersionBuffer)
{
delete []m_pVersionBuffer;
m_pVersionBuffer = NULL;
}
m_bValid = false;
DWORD dwUnused = 0;
DWORD dwSize = ::GetFileVersionInfoSize(strPath, &dwUnused);
if(!dwSize)
return false;
UINT nLen = 0;
m_pVersionBuffer = new BYTE[dwSize];
VS_FIXEDFILEINFO * pInfo = NULL;
DWORD dwVersion = 0;
BOOL bRes = ::GetFileVersionInfo(strPath, dwUnused, dwSize, m_pVersionBuffer);
if(bRes)
{
m_bValid = true;
if(::VerQueryValue(m_pVersionBuffer, _T("\\"), (LPVOID*)&pInfo, &nLen))
{
long HighVersion = HIWORD(pInfo->dwProductVersionMS);
long LowVersion = LOWORD(pInfo->dwProductVersionMS);
long BuildNumber = HIWORD(pInfo->dwProductVersionLS);
long RevisionNumber = LOWORD(pInfo->dwProductVersionLS);
m_pProductVersion->Initialize(HighVersion, LowVersion, BuildNumber, RevisionNumber);
HighVersion = HIWORD(pInfo->dwFileVersionMS);
LowVersion = LOWORD(pInfo->dwFileVersionMS);
BuildNumber = HIWORD(pInfo->dwFileVersionLS);
RevisionNumber = LOWORD(pInfo->dwFileVersionLS);
m_pFileVersion->Initialize(HighVersion, LowVersion, BuildNumber, RevisionNumber);
if(pInfo->dwFileFlags & VS_FF_DEBUG)
m_bDebug = true;
if(pInfo->dwFileFlags & VS_FF_PATCHED)
m_bPatched = true;
if(pInfo->dwFileFlags & VS_FF_PRERELEASE)
m_bPreRelease = true;
}
}
return m_bValid;
}
////////////////////////////////////////////////////////////////////////
// Interface Implementation;
////////////////////////////////////////////////////////////////////////
STDMETHODIMP CPSLModuleVersion::get_IsValid(VARIANT_BOOL * pValue)
{
PSL_BEGIN
*pValue = m_bValid?VARIANT_TRUE:VARIANT_FALSE;
PSL_END
}
STDMETHODIMP CPSLModuleVersion::get_IsDebug(VARIANT_BOOL * pValue)
{
PSL_BEGIN
*pValue = m_bDebug?VARIANT_TRUE:VARIANT_FALSE;
PSL_END
}
STDMETHODIMP CPSLModuleVersion::get_IsPatched(VARIANT_BOOL * pValue)
{
PSL_BEGIN
*pValue = m_bPatched?VARIANT_TRUE:VARIANT_FALSE;
PSL_END
}
STDMETHODIMP CPSLModuleVersion::get_IsPreRelease(VARIANT_BOOL * pValue)
{
PSL_BEGIN
*pValue = m_bPreRelease?VARIANT_TRUE:VARIANT_FALSE;
PSL_END
}
STDMETHODIMP CPSLModuleVersion::get_ProductVersion(IPSLVersionNumber ** ppValue)
{
PSL_BEGIN
m_pProductVersion->AddRef();
*ppValue = CComPtr<IPSLVersionNumber>(m_pProductVersion);
PSL_END
}
STDMETHODIMP CPSLModuleVersion::get_FileVersion(IPSLVersionNumber ** ppValue)
{
PSL_BEGIN
m_pFileVersion->AddRef();
*ppValue = CComPtr<IPSLVersionNumber>(m_pFileVersion);
PSL_END
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.