windows-nt/Source/XPSP1/NT/base/cluster/wmiprovider/provfactory.cpp
2020-09-26 16:20:57 +08:00

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()