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
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;
|
|
}
|