windows-nt/Source/XPSP1/NT/com/oleutest/balls/common/cfballs.cxx
2020-09-26 16:20:57 +08:00

128 lines
2.4 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: cfballs.cxx
//
// Contents: implementations for CFactory
//
// Functions:
// CCube::CCube
// CCube::~CCube
// CCube::QueryInterface
// CCube::CreateCube
// CCube::MoveCube
// CCube::GetCubePos
//
// History: 06-Aug-92 Ricksa Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <ctballs.hxx>
#include <cfballs.hxx>
CFactory::CFactory(REFCLSID rclsid, BOOL fServer)
: _fServer(fServer), _clsid(rclsid), _cRefs(1), _cLocks(0)
{
// Header does all the work
}
CFactory::~CFactory()
{
// Default actions are enough
}
STDMETHODIMP CFactory::QueryInterface(REFIID iid, void FAR * FAR * ppv)
{
if (IsEqualIID(iid, IID_IUnknown)
|| IsEqualIID(iid, IID_IClassFactory))
{
*ppv = (IUnknown *) this;
AddRef();
return ResultFromSCode(S_OK);
}
*ppv = NULL;
return ResultFromSCode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CFactory::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) CFactory::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 CFactory::CreateInstance(
IUnknown FAR* pUnkOuter,
REFIID iidInterface,
void FAR* FAR* ppv)
{
if (pUnkOuter != NULL)
{
// Object does not support aggregation
return ResultFromSCode(E_NOINTERFACE);
}
CTestBalls *ptballs = new CTestBalls(_clsid);
HRESULT hr = ptballs->QueryInterface(iidInterface, ppv);
ptballs->Release();
return hr;
}
STDMETHODIMP CFactory::LockServer(BOOL fLock)
{
if (fLock)
{
InterlockedIncrement(&_cLocks);
GlobalRefs(TRUE);
}
else
{
InterlockedDecrement(&_cLocks);
GlobalRefs(FALSE);
}
return ResultFromSCode(S_OK);
}