Files
Work/proto/source/CFACTORY.CPP
2024-08-07 09:16:27 -04:00

108 lines
2.4 KiB
C++

#include <proto/cfactory.hpp>
#include <proto/sobj.hpp>
//#include <proto/guids.hpp>
#pragma warning(disable:4355)
CFSimpleObject::CFSimpleObject(PIUnknown &pUnkOuter,SmartPointer<DLLServer> &server)
: mImpIClassFactory(SmartPointer<CFSimpleObject>(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<CFSimpleObject> &pBackObj,PIUnknown &pUnkOuter,SmartPointer<DLLServer> &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<CSimpleObject> 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;
}