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 |