Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

147 lines
3.6 KiB

//---------------------------------------------------------------------------
//
// File: CLSSFACT.CPP
//
// Implements a class factory object that creates CPropSheetExt objects.
//
//---------------------------------------------------------------------------
#include "clssfact.h"
extern ULONG g_cObj; // See PLUSTAB.CPP
extern ULONG g_cLock; // See PLUSTAB.CPP
//---------------------------------------------------------------------------
// ObjectDestroyed()
//
// Function for the CPropSheetExt object to call when it is destroyed.
// Because we're in a DLL, we only track the number of objects here,
// letting DllCanUnloadNow take care of the rest.
//---------------------------------------------------------------------------
void FAR PASCAL ObjectDestroyed( void )
{
g_cObj--;
return;
}
//---------------------------------------------------------------------------
// Class Member functions
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Constructor
//---------------------------------------------------------------------------
CClassFactory::CClassFactory()
{
m_cRef = 0L;
return;
}
//---------------------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------------
CClassFactory::~CClassFactory( void )
{
return;
}
//---------------------------------------------------------------------------
// QueryInterface()
//---------------------------------------------------------------------------
STDMETHODIMP CClassFactory::QueryInterface( REFIID riid, LPVOID* ppv )
{
*ppv = NULL;
//Any interface on this object is the object pointer.
if( IsEqualIID( riid, IID_IUnknown ) || IsEqualIID( riid, IID_IClassFactory ) )
{
*ppv = (LPVOID)this;
++m_cRef;
return NOERROR;
}
return E_NOINTERFACE;
}
//---------------------------------------------------------------------------
// AddRef()
//---------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CClassFactory::AddRef()
{
return ++m_cRef;
}
//---------------------------------------------------------------------------
// Release()
//---------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CClassFactory::Release()
{
ULONG cRefT;
cRefT = --m_cRef;
if( 0L == m_cRef )
delete this;
return cRefT;
}
//---------------------------------------------------------------------------
// CreateInstance()
//---------------------------------------------------------------------------
STDMETHODIMP CClassFactory::CreateInstance( LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR *ppvObj )
{
CPropSheetExt* pObj;
HRESULT hr = E_OUTOFMEMORY;
*ppvObj = NULL;
// We don't support aggregation at all.
if( pUnkOuter )
{
return CLASS_E_NOAGGREGATION;
}
//Verify that a controlling unknown asks for IShellPropSheetExt
if( IsEqualIID( riid, IID_IShellPropSheetExt ) )
{
//Create the object, passing function to notify on destruction
pObj = new CPropSheetExt( pUnkOuter, ObjectDestroyed );
if( NULL == pObj )
{
return hr;
}
hr = pObj->QueryInterface( riid, ppvObj );
//Kill the object if initial creation or FInit failed.
if( FAILED(hr) )
{
delete pObj;
}
else
{
g_cObj++;
}
return hr;
}
return E_NOINTERFACE;
}
//---------------------------------------------------------------------------
// LockServer()
//---------------------------------------------------------------------------
STDMETHODIMP CClassFactory::LockServer( BOOL fLock )
{
if( fLock )
{
g_cLock++;
}
else
{
g_cLock--;
}
return NOERROR;
}