241 lines
5.3 KiB
C++
241 lines
5.3 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CopyRight (c) 1999-2000 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// ProvFactory.cpp
|
|
//
|
|
// Description:
|
|
// Implementation of CProvFactory class.
|
|
//
|
|
// Author:
|
|
// Henry Wang (HenryWa) 24-AUG-1999
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "Pch.h"
|
|
#include "ProvFactory.h"
|
|
|
|
//****************************************************************************
|
|
//
|
|
// CProvFactory
|
|
//
|
|
//****************************************************************************
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// STDMETHODIMP
|
|
// CProvFactory::QueryInterface(
|
|
// REFIID riidIn,
|
|
// PPVOID ppvOut
|
|
// )
|
|
//
|
|
// Description:
|
|
// Query for an interface supported by this COM object.
|
|
//
|
|
// Arguments:
|
|
// riidIn -- Interface ID.
|
|
// ppvOut -- Receives the interface pointer.
|
|
//
|
|
// Return Values:
|
|
// NOERROR
|
|
// E_NOINTERFACE
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP
|
|
CProvFactory::QueryInterface(
|
|
REFIID riidIn,
|
|
PPVOID ppvOut
|
|
)
|
|
{
|
|
*ppvOut = NULL;
|
|
|
|
if ( IID_IUnknown == riidIn || IID_IClassFactory == riidIn )
|
|
{
|
|
*ppvOut = this;
|
|
}
|
|
|
|
if ( NULL != *ppvOut )
|
|
{
|
|
( (LPUNKNOWN) *ppvOut )->AddRef( );
|
|
return NOERROR;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
|
|
} //*** CProvFactory::QueryInterface()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// STDMETHODIMP_( ULONG )
|
|
// CProvFactory::AddRef ( void )
|
|
//
|
|
// Description:
|
|
// Increment the reference count on the COM object.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// New count of references.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP_( ULONG )
|
|
CProvFactory::AddRef ( void )
|
|
{
|
|
//return ++m_cRef;
|
|
return InterlockedIncrement( (long *) &m_cRef );
|
|
|
|
} //*** CProvFactory::AddRef()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// STDMETHODIMP_( ULONG )
|
|
// CProvFactory::Release( void )
|
|
//
|
|
// Description:
|
|
// Decrement the reference count on the COM object.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// New count of references.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP_( ULONG )
|
|
CProvFactory::Release( void )
|
|
{
|
|
ULONG nNewCount = InterlockedDecrement( (long *) & m_cRef );
|
|
if ( 0L == nNewCount )
|
|
{
|
|
delete this;
|
|
} // if: 0L == nNewCount
|
|
|
|
return nNewCount;
|
|
|
|
} //*** CProvFactory::Release()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// STDMETHODIMP
|
|
// CProvFactory::CreateInstance(
|
|
// LPUNKNOWN pUnkOuterIn,
|
|
// REFIID riidIn,
|
|
// PPVOID ppvObjOut
|
|
// )
|
|
//
|
|
// Description:
|
|
// Instantiates a Locator object returning an interface pointer.
|
|
//
|
|
// Arguments:
|
|
// pUnkOuterIn
|
|
// LPUNKNOWN to the controlling IUnknown if we are being used in
|
|
// an aggregation.
|
|
//
|
|
// riidIn
|
|
// REFIID identifying the interface the caller desires to have
|
|
// for the new object.
|
|
//
|
|
// ppvObjOut
|
|
// PPVOID in which to store the desired interface pointer for the
|
|
// new object.
|
|
//
|
|
// Return Values:
|
|
// NOERROR
|
|
// E_OUTOFMEMORY
|
|
// E_NOINTERFACE
|
|
// CLASS_E_NOAGGREGATION
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP
|
|
CProvFactory::CreateInstance(
|
|
LPUNKNOWN pUnkOuterIn,
|
|
REFIID riidIn,
|
|
PPVOID ppvObjOut
|
|
)
|
|
{
|
|
IUnknown * pObj = NULL;
|
|
HRESULT hr;
|
|
|
|
*ppvObjOut = NULL;
|
|
|
|
// This object doesnt support aggregation.
|
|
|
|
if ( NULL != pUnkOuterIn )
|
|
{
|
|
return CLASS_E_NOAGGREGATION;
|
|
} /// if: not pUnkOuter
|
|
|
|
|
|
hr = m_pFactoryData->pFnCreateInstance(
|
|
NULL,
|
|
reinterpret_cast< VOID ** >( &pObj )
|
|
);
|
|
|
|
if ( NULL == pObj )
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
} // if: pObj is NULL
|
|
|
|
hr = pObj->QueryInterface( riidIn, ppvObjOut );
|
|
|
|
//Kill the object if initial creation or Init failed.
|
|
|
|
if ( FAILED( hr ) )
|
|
{
|
|
delete pObj;
|
|
} // if: failed
|
|
|
|
return hr;
|
|
|
|
} //*** CProvFactory::CreateInstance()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// STDMETHODIMP
|
|
// CProvFactory::LockServer(
|
|
// BOOL fLockIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Increments or decrements the lock count of the DLL. If the lock
|
|
// count goes to zero and there are no objects, the DLL is allowed to
|
|
// unload. See DllCanUnloadNow.
|
|
//
|
|
// Arguments:
|
|
// fLockIn
|
|
// BOOL specifying whether to increment or decrement the lock count.
|
|
//
|
|
// Return Values:
|
|
// NOERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP
|
|
CProvFactory::LockServer(
|
|
BOOL fLockIn
|
|
)
|
|
{
|
|
if ( fLockIn )
|
|
{
|
|
InterlockedIncrement( & g_cLock );
|
|
} /// if: lock
|
|
else
|
|
{
|
|
InterlockedDecrement( & g_cLock );
|
|
} /// else:
|
|
|
|
return NOERROR;
|
|
|
|
} //*** CProvFactory::LockServer()
|