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.
133 lines
2.7 KiB
133 lines
2.7 KiB
//+-------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|