Source code of Windows XP (NT5)
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.
|
|
//+---------------------------------------------------------------------
//
// File: stdfact.cxx
//
// Contents: Standard IClassFactory implementation
//
// Classes: StdClassFactory
//
//----------------------------------------------------------------------
#include "headers.hxx"
#pragma hdrstop
//+---------------------------------------------------------------
//
// Member: StdClassFactory::StdClassFactory, public
//
// Synopsis: Constructor for StdUnknown class
//
//----------------------------------------------------------------
StdClassFactory::StdClassFactory(void) { _ulRefs = 0; _ulLocks = 0; }
//+---------------------------------------------------------------
//
// Member: StdClassFactory::AddRef, public
//
// Synopsis: Method of IUnknown interface
//
//----------------------------------------------------------------
STDMETHODIMP_(ULONG) StdClassFactory::AddRef(void) { return ++_ulRefs; }
//+---------------------------------------------------------------
//
// Member: StdClassFactory::Release, public
//
// Synopsis: Method of IUnknown interface
//
//----------------------------------------------------------------
STDMETHODIMP_(ULONG) StdClassFactory::Release(void) { Assert(_ulRefs > 0); --_ulRefs;
#if DBG
if(_ulRefs == 0) DOUT(TEXT("StdClassFactory::Release _ulRefs == 0\r\n")); #endif
return _ulRefs; }
//+---------------------------------------------------------------
//
// Member: StdClassFactory::QueryInterface, public
//
// Synopsis: Method of IUnknown interface
//
//----------------------------------------------------------------
STDMETHODIMP StdClassFactory::QueryInterface(REFIID riid, LPVOID FAR* ppv) { #if DBG
TCHAR achBuffer[256]; wsprintf(achBuffer, TEXT("StdClassFactory::QueryInterface (%lx)\r\n"), riid.Data1); DOUT(achBuffer); #endif
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) { AddRef(); *ppv = (LPCLASSFACTORY)this; return NOERROR; } *ppv = NULL; DOUT(TEXT("StdClassFactory::QueryInterface returning E_NOINTERFACE\r\n")); return E_NOINTERFACE; }
//+---------------------------------------------------------------
//
// Member: StdClassFactory::LockServer, public
//
// Synopsis: Method of IClassFactory interface
//
//----------------------------------------------------------------
STDMETHODIMP StdClassFactory::LockServer (BOOL fLock) { if (fLock) { _ulLocks++; } else { Assert(_ulLocks > 0); _ulLocks--; } return NOERROR; }
#ifdef DOCGEN
//+---------------------------------------------------------------
//
// Member: StdClassFactory::CreateInstance, public
//
// Synopsis: Manufactures an instance of the class
//
// Notes: This pure virtual function must be overridden by the inheriting
// class because the base class does not know what class to
// instantiate.
//
//----------------------------------------------------------------
STDMETHODIMP StdClassFactory::CreateInstance(LPUNKNOWN pUnkOuter, REFIID iid, LPVOID FAR* ppv) {};
//REVIEW: how to enforce ref counting of Class factory in object
// constructor/destructor? Can we do this in a conjunction of StdUnknown
// with StdClassFactory.
#endif // DOCGEN
//+---------------------------------------------------------------
//
// Member: StdClassFactory::CanUnload, public
//
// Synopsis: Returns TRUE iff there are no extant instances of
// this class, outstanding references on the class factory,
// or locks on the class factory.
//
// Notes: This function is for use in the standard DllCanUnloadNow
// function.
//
//----------------------------------------------------------------
BOOL StdClassFactory::CanUnload(void) { return _ulRefs == 0 && _ulLocks == 0; }
|