Initial
This commit is contained in:
107
proto/source/CFACTORY.CPP
Normal file
107
proto/source/CFACTORY.CPP
Normal file
@@ -0,0 +1,107 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user