Back

#pragma once

/////////////////////////////////////////
// Purpose of the class:
//
// - on-demand instantiation;
//
template<class T>
class CAutoObject
{
public:

   CAutoObject()
   {
      m_pObject = NULL;
      ::InitializeCriticalSection(&m_cs);
   }
   virtual ~CAutoObject()
   {
      ::EnterCriticalSection(&m_cs);
      if(m_pObject)
      {
         m_pObject->Release();
         m_pObject = NULL;
      }
      ::LeaveCriticalSection(&m_cs);
      ::DeleteCriticalSection(&m_cs);
   }

   operator CComObject<T> * ()
   {
      CComObject<T> * pObject = NULL;
      ::EnterCriticalSection(&m_cs);
      if(!m_pObject)
      {
         if(CComObject<T>::CreateInstance(&m_pObject) == S_OK)
            m_pObject->AddRef();
      }
      if(m_pObject)
      {
         m_pObject->AddRef();
         pObject = m_pObject;
      }
      ::LeaveCriticalSection(&m_cs);
      return pObject;
   }

private:

   CRITICAL_SECTION m_cs;
   CComObject<T> * m_pObject;
};

Top