#include #include //#include #pragma warning(disable:4355) CFSimpleObject::CFSimpleObject(PIUnknown &pUnkOuter,SmartPointer &server) : mImpIClassFactory(SmartPointer(this),pUnkOuter,server), mRefCount(0), mUnkOuter(pUnkOuter), mDLLServer(server) { } CFSimpleObject::~CFSimpleObject() { } ULONG __stdcall CFSimpleObject::AddRef(void) { mRefCount++; return mRefCount; } ULONG __stdcall CFSimpleObject::Release(void) { mRefCount--; if(0==mRefCount) { if(mDLLServer.isOkay())mDLLServer->removeObject(); mRefCount++; delete this; } return mRefCount; } HRESULT __stdcall CFSimpleObject::QueryInterface(REFIID riid,PPVOID ppv) { HRESULT hr(E_NOINTERFACE); *ppv=0; if(IID_IUnknown==riid)*ppv=this; else if(IID_IClassFactory==riid)*ppv=&mImpIClassFactory; if(0!=*ppv)((LPUNKNOWN)*ppv)->AddRef(),hr=NOERROR; return hr; } CImpIClassFactory::CImpIClassFactory(SmartPointer &pBackObj,PIUnknown &pUnkOuter,SmartPointer &server) : mRefCount(0), mBackObj(pBackObj), mDLLServer(server) { if(!pUnkOuter.isOkay())mUnkOuter=PIUnknown((IUnknown*)((CFSimpleObject*)pBackObj)); else mUnkOuter=pUnkOuter; } CImpIClassFactory::~CImpIClassFactory() { } HRESULT __stdcall CImpIClassFactory::QueryInterface(REFIID riid,PPVOID ppv) { return mUnkOuter->QueryInterface(riid,ppv); } ULONG __stdcall CImpIClassFactory::AddRef(void) { mRefCount++; return mUnkOuter->AddRef(); } ULONG __stdcall CImpIClassFactory::Release(void) { mRefCount--; return mUnkOuter->Release(); } HRESULT __stdcall CImpIClassFactory::CreateInstance(IUnknown *pUnkOuter,REFIID riid,PPVOID ppv) { HRESULT hr(E_FAIL); SmartPointer simpleObject; *ppv=0; if(pUnkOuter&&IID_IUnknown!=riid)hr=CLASS_E_NOAGGREGATION; else { simpleObject=::new CSimpleObject(PIUnknown(pUnkOuter),mDLLServer); simpleObject.disposition(PointerDisposition::Assume); if(simpleObject.isOkay()) { mDLLServer->addObject(); hr=simpleObject->QueryInterface(riid,ppv); if(FAILED(hr)) { mDLLServer->removeObject(); simpleObject.disposition(PointerDisposition::Delete); simpleObject.destroy(); } } else hr=E_OUTOFMEMORY; } return hr; } HRESULT __stdcall CImpIClassFactory::LockServer(BOOL lock) { HRESULT hr(NOERROR); if(lock)mDLLServer->addLock(); else mDLLServer->removeLock(); return hr; }