joachim99@75: /* joachim99@75: * Copyright (c) 2003, Sergey Zorin. All rights reserved. joachim99@75: * joachim99@75: * This software is distributable under the BSD license. See the terms joachim99@75: * of the BSD license in the LICENSE file provided with this software. joachim99@75: * joachim99@75: */ joachim99@75: joachim99@75: #include "class_factory.h" joachim99@75: #include "diff_ext.h" joachim99@75: #include "server.h" joachim99@75: joachim99@75: CLASS_FACTORY::CLASS_FACTORY() { joachim99@75: _ref_count = 0L; joachim99@75: joachim99@75: SERVER::instance()->lock(); joachim99@75: } joachim99@75: joachim99@75: CLASS_FACTORY::~CLASS_FACTORY() { joachim99@75: SERVER::instance()->release(); joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP joachim99@75: CLASS_FACTORY::QueryInterface(REFIID riid, void** ppv) { joachim99@75: HRESULT ret = E_NOINTERFACE; joachim99@75: *ppv = 0; joachim99@75: joachim99@75: if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) { joachim99@75: *ppv = static_cast(this); joachim99@75: joachim99@75: AddRef(); joachim99@75: joachim99@75: ret = NOERROR; joachim99@75: } joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP_(ULONG) joachim99@75: CLASS_FACTORY::AddRef() { joachim99@75: return InterlockedIncrement((LPLONG)&_ref_count); joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP_(ULONG) joachim99@75: CLASS_FACTORY::Release() { joachim99@75: ULONG ret = 0L; joachim99@75: joachim99@75: if(InterlockedDecrement((LPLONG)&_ref_count) != 0) joachim99@75: ret = _ref_count; joachim99@75: else joachim99@75: delete this; joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP joachim99@75: CLASS_FACTORY::CreateInstance(IUnknown* outer, REFIID refiid, void** obj) { joachim99@75: HRESULT ret = CLASS_E_NOAGGREGATION; joachim99@75: *obj = 0; joachim99@75: joachim99@75: // Shell extensions typically don't support aggregation (inheritance) joachim99@75: if(outer == 0) { joachim99@75: DIFF_EXT* ext = new DIFF_EXT(); joachim99@75: joachim99@75: if(ext == 0) joachim99@75: ret = E_OUTOFMEMORY; joachim99@75: else joachim99@75: ret = ext->QueryInterface(refiid, obj); joachim99@75: } joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP joachim99@75: CLASS_FACTORY::LockServer(BOOL) { joachim99@75: return NOERROR; joachim99@75: }