Leaked source code of windows server 2003
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.
|
|
//////////////////////////////////////////////////////////////////////////////
//
// 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()
|