108 lines
2.4 KiB
C++
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;
|
|
}
|