196 lines
3.3 KiB
C++
196 lines
3.3 KiB
C++
//
|
|
// Copyright 1997 - Microsoft
|
|
//
|
|
|
|
//
|
|
// CFACTORY.CPP - Class Factory Object
|
|
//
|
|
|
|
#include "pch.h"
|
|
|
|
DEFINE_MODULE("IMADMUI")
|
|
DEFINE_THISCLASS("CFactory")
|
|
#define THISCLASS CFactory
|
|
|
|
// ************************************************************************
|
|
//
|
|
// Constructor / Destructor
|
|
//
|
|
// ************************************************************************
|
|
|
|
//
|
|
// Constructor
|
|
//
|
|
THISCLASS::THISCLASS( LPCREATEINST pfn )
|
|
{
|
|
TraceClsFunc( "CFactory()\n" );
|
|
|
|
_pfnCreateInstance = pfn;
|
|
|
|
InterlockIncrement( g_cObjects );
|
|
|
|
TraceFuncExit();
|
|
}
|
|
|
|
STDMETHODIMP
|
|
THISCLASS::Init( )
|
|
{
|
|
TraceClsFunc( "Init()\n");
|
|
|
|
//
|
|
// IUnknown stuff
|
|
//
|
|
Assert( _cRef == 0 );
|
|
|
|
// Build QI Table
|
|
BEGIN_QITABLE_IMP( CFactory, IClassFactory );
|
|
QITABLE_IMP( IClassFactory );
|
|
END_QITABLE_IMP( CFactory );
|
|
|
|
// Add one count
|
|
AddRef( );
|
|
|
|
//
|
|
// Private Members
|
|
//
|
|
|
|
HRETURN(S_OK);
|
|
};
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
THISCLASS::~THISCLASS( )
|
|
{
|
|
TraceClsFunc( "~CFactory()\n" );
|
|
|
|
InterlockDecrement( g_cObjects );
|
|
|
|
TraceFuncExit();
|
|
};
|
|
|
|
// ************************************************************************
|
|
//
|
|
// IUnknown
|
|
//
|
|
// ************************************************************************
|
|
|
|
//
|
|
// QueryInterface()
|
|
//
|
|
STDMETHODIMP
|
|
THISCLASS::QueryInterface(
|
|
REFIID riid,
|
|
LPVOID *ppv )
|
|
{
|
|
TraceClsFunc( "" );
|
|
|
|
HRESULT hr = ::QueryInterface( this, _QITable, riid, ppv );
|
|
|
|
QIRETURN( hr, riid );
|
|
}
|
|
|
|
//
|
|
// AddRef()
|
|
//
|
|
STDMETHODIMP_(ULONG)
|
|
THISCLASS::AddRef( void )
|
|
{
|
|
TraceClsFunc( "[IUnknown] AddRef( )\n" );
|
|
|
|
InterlockIncrement( _cRef );
|
|
|
|
RETURN(_cRef);
|
|
}
|
|
|
|
//
|
|
// Release()
|
|
//
|
|
STDMETHODIMP_(ULONG)
|
|
THISCLASS::Release( void )
|
|
{
|
|
TraceClsFunc( "[IUnknown] Release( )\n" );
|
|
|
|
InterlockDecrement( _cRef );
|
|
|
|
if ( _cRef )
|
|
RETURN(_cRef);
|
|
|
|
TraceDo( delete this );
|
|
|
|
RETURN(0);
|
|
}
|
|
|
|
// ************************************************************************
|
|
//
|
|
// IClassFactory
|
|
//
|
|
// ************************************************************************
|
|
|
|
//
|
|
// CreateInstance()
|
|
//
|
|
STDMETHODIMP
|
|
THISCLASS::
|
|
CreateInstance(
|
|
IUnknown *pUnkOuter,
|
|
REFIID riid,
|
|
void **ppv )
|
|
{
|
|
TraceClsFunc( "[IClassFactory] CreateInstance()\n" );
|
|
|
|
if ( !ppv )
|
|
RRETURN(E_POINTER);
|
|
|
|
*ppv = NULL;
|
|
|
|
HRESULT hr = E_NOINTERFACE;
|
|
IUnknown * pUnk = NULL;
|
|
|
|
if ( NULL != pUnkOuter )
|
|
{
|
|
hr = THR(CLASS_E_NOAGGREGATION);
|
|
goto Cleanup;
|
|
}
|
|
|
|
Assert( _pfnCreateInstance != NULL );
|
|
TraceMsgDo( pUnk = (IUnknown *) _pfnCreateInstance( ), "0x%08x" );
|
|
if ( !pUnk )
|
|
{
|
|
hr = THR(E_OUTOFMEMORY);
|
|
goto Cleanup;
|
|
}
|
|
|
|
TraceMsgDo( hr = pUnk->QueryInterface( riid, ppv ), "0x%08x" );
|
|
|
|
Cleanup:
|
|
if ( !!pUnk )
|
|
{
|
|
ULONG cRef;
|
|
TraceMsgDo( cRef = pUnk->Release( ), "%u" );
|
|
}
|
|
|
|
HRETURN(hr);
|
|
}
|
|
|
|
//
|
|
// LockServer()
|
|
//
|
|
STDMETHODIMP
|
|
THISCLASS::
|
|
LockServer( BOOL fLock )
|
|
{
|
|
TraceClsFunc( "[IClassFactory] LockServer()\n");
|
|
|
|
if ( fLock )
|
|
{
|
|
InterlockIncrement( g_cLock );
|
|
}
|
|
else
|
|
{
|
|
InterlockDecrement( g_cLock );
|
|
}
|
|
|
|
HRETURN(S_OK);
|
|
}
|