Back

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

Top