//+------------------------------------------------------------------- // // File: actcf.cxx // // Contents: object activation test class factory // // Classes: CActClassFactory // // Functions: // // History: 23-Nov-92 Ricksa Created // //-------------------------------------------------------------------- #include #pragma hdrstop #include // CActClassFactory #include // 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; }