134 lines
2.6 KiB
C++
134 lines
2.6 KiB
C++
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// File: actcf.cxx
|
||
|
//
|
||
|
// Contents: object activation test class factory
|
||
|
//
|
||
|
// Classes: CActClassFactory
|
||
|
//
|
||
|
// Functions:
|
||
|
//
|
||
|
// History: 23-Nov-92 Ricksa Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
#include <pch.cxx>
|
||
|
#pragma hdrstop
|
||
|
#include <actcf.hxx> // CActClassFactory
|
||
|
#include <cact.hxx> // CTestAct
|
||
|
|
||
|
|
||
|
|
||
|
const GUID CLSID_TestSingleUse =
|
||
|
{0x99999999,0x0000,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x50}};
|
||
|
|
||
|
const GUID CLSID_TestMultipleUse =
|
||
|
{0x99999999,0x0000,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x51}};
|
||
|
|
||
|
const GUID CLSID_DistBind =
|
||
|
{0x99999999,0x0000,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x55}};
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
CActClassFactory::CActClassFactory(REFCLSID rclsid, BOOL fServer)
|
||
|
: _fServer(fServer), _clsid(rclsid), _cRefs(1), _cLocks(0)
|
||
|
{
|
||
|
// Header does all the work
|
||
|
}
|
||
|
|
||
|
CActClassFactory::~CActClassFactory()
|
||
|
{
|
||
|
// Default actions are enough
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CActClassFactory::QueryInterface(REFIID iid, void FAR * FAR * ppv)
|
||
|
{
|
||
|
if (IsEqualIID(iid, IID_IUnknown) ||
|
||
|
IsEqualIID(iid, IID_IClassFactory))
|
||
|
{
|
||
|
*ppv = (IUnknown *) this;
|
||
|
AddRef();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
*ppv = NULL;
|
||
|
return E_NOINTERFACE;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CActClassFactory::AddRef(void)
|
||
|
{
|
||
|
InterlockedIncrement(&_cRefs);
|
||
|
|
||
|
if (!_fServer)
|
||
|
{
|
||
|
// This is not being used in a server so we want to bump the
|
||
|
// reference count. In a server we use the lock count rather
|
||
|
// than the reference count to tell whether we should go away.
|
||
|
GlobalRefs(TRUE);
|
||
|
}
|
||
|
|
||
|
return _cRefs;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CActClassFactory::Release(void)
|
||
|
{
|
||
|
BOOL fKeepObject = InterlockedDecrement(&_cRefs);
|
||
|
|
||
|
if (!_fServer)
|
||
|
{
|
||
|
// This is not being used in a server so we want to bump the
|
||
|
// reference count. In a server we use the lock count rather
|
||
|
// than the reference count to tell whether we should go away.
|
||
|
GlobalRefs(FALSE);
|
||
|
}
|
||
|
|
||
|
if (!fKeepObject)
|
||
|
{
|
||
|
delete this;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return _cRefs;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CActClassFactory::CreateInstance(
|
||
|
IUnknown FAR* pUnkOuter,
|
||
|
REFIID iidInterface,
|
||
|
void FAR* FAR* ppv)
|
||
|
{
|
||
|
if (pUnkOuter != NULL)
|
||
|
{
|
||
|
// Object does not support aggregation
|
||
|
return E_NOINTERFACE;
|
||
|
}
|
||
|
|
||
|
CTestAct *ptballs = new CTestAct(_clsid);
|
||
|
|
||
|
HRESULT hr = ptballs->QueryInterface(iidInterface, ppv);
|
||
|
|
||
|
ptballs->Release();
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CActClassFactory::LockServer(BOOL fLock)
|
||
|
{
|
||
|
if (fLock)
|
||
|
{
|
||
|
InterlockedIncrement(&_cLocks);
|
||
|
|
||
|
GlobalRefs(TRUE);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
InterlockedDecrement(&_cLocks);
|
||
|
|
||
|
GlobalRefs(FALSE);
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|