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.
 
 
 
 
 
 

208 lines
4.9 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: Clsfact.cpp
//
// Contents: Class Factory
//
// Classes: CClassFactory
//
// Notes:
//
// History: 05-Nov-97 rogerg Created.
//
//--------------------------------------------------------------------------
#include "precomp.h"
//+---------------------------------------------------------------------------
//
// Member: CClassFactory::CClassFactory, public
//
// Synopsis: Constructor
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
CClassFactory::CClassFactory()
{
m_cRef = 1;
return;
}
//+---------------------------------------------------------------------------
//
// Member: CClassFactory::~CClassFactory, public
//
// Synopsis: Destructor
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
CClassFactory::~CClassFactory( void )
{
Assert(0 == m_cRef);
return;
}
//+---------------------------------------------------------------------------
//
// Member: CClassFactory::QueryInterface, public
//
// Synopsis: Standard QueryInterface
//
// Arguments: [iid] - Interface ID
// [ppvObj] - Object return
//
// Returns: Appropriate status code
//
// Modifies: [ppvObj]
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
STDMETHODIMP CClassFactory::QueryInterface( REFIID riid, LPVOID* ppv )
{
*ppv = NULL;
if( IsEqualIID( riid, IID_IUnknown ) || IsEqualIID( riid, IID_IClassFactory ) )
{
*ppv = (LPVOID)this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
//+---------------------------------------------------------------------------
//
// Member: CClassFactory::AddRef, public
//
// Synopsis: Add reference
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CClassFactory::AddRef()
{
ULONG cRefs;
cRefs = InterlockedIncrement((LONG *)& m_cRef);
return cRefs;
}
//+---------------------------------------------------------------------------
//
// Member: CClasFactory::Release, public
//
// Synopsis: Release reference
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CClassFactory::Release()
{
ULONG cRefs;
cRefs = InterlockedDecrement( (LONG *) &m_cRef);
if (0 == cRefs)
{
delete this;
}
return cRefs;
}
//+---------------------------------------------------------------------------
//
// Member: CClassFactory::CreateInstance, public
//
// Synopsis: Creates and instance of the requested object
//
// Arguments: [pUnkOuter] - Controlling unknown
// [riid] - Requested interface
// [ppvObj] - object pointer
//
// Returns: Appropriate status code
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
STDMETHODIMP CClassFactory::CreateInstance( LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR *ppvObj )
{
HRESULT hr = E_OUTOFMEMORY;
CSynchronizeInvoke *pNewSynchronizeInstance;
*ppvObj = NULL;
// We don't support aggregation at all.
if( pUnkOuter )
{
return CLASS_E_NOAGGREGATION;
}
//Create the object, passing function to notify on destruction
pNewSynchronizeInstance = new CSynchronizeInvoke(); // initialized RefCount to 1.
if( NULL == pNewSynchronizeInstance )
{
return hr;
}
hr = pNewSynchronizeInstance->QueryInterface( riid, ppvObj );
pNewSynchronizeInstance->Release(); // release our copy of the object
return hr;
}
//+---------------------------------------------------------------------------
//
// Member: CClassFactory::LockServer, public
//
// Synopsis: Locks the Server
//
// Arguments: [fLock] - To Lock or Unlock
//
// Returns: Appropriate status code
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
STDMETHODIMP CClassFactory::LockServer( BOOL fLock )
{
if( fLock )
{
AddRefOneStopLifetime(TRUE /*External*/);
}
else
{
ReleaseOneStopLifetime(TRUE /*External*/);
}
return S_OK;
}