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.
|
|
//+-------------------------------------------------------------------------
//
// 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; }
|