Initial
This commit is contained in:
68
com/hold/factory.cpp
Normal file
68
com/hold/factory.cpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#include <com/factory.hpp>
|
||||
#include <com/result.hpp>
|
||||
#include <com/instance.hpp>
|
||||
|
||||
ClassFactory::ClassFactory(DLLServer &server,Console &winConsole)
|
||||
: mRefCount(0), mServer(server), mWinConsole(winConsole), mpInstantiator(0)
|
||||
{
|
||||
mWinConsole.writeLine("<ClassFactory::ClassFactory>");
|
||||
}
|
||||
|
||||
ClassFactory::~ClassFactory()
|
||||
{
|
||||
mWinConsole.writeLine("<ClassFactory::~ClassFactory>");
|
||||
}
|
||||
|
||||
HRESULT __stdcall ClassFactory::QueryInterface(REFIID riid,void **ppv)
|
||||
{
|
||||
mWinConsole.writeLine("<ClassFactory::QueryInterface>");
|
||||
if(IsEqualIID(riid,IID_IUnknown)||IsEqualIID(riid,IID_IClassFactory))*ppv=this;
|
||||
else {*ppv=0;return ComResult::NoInterface;}
|
||||
AddRef();
|
||||
return ComResult::NoError;
|
||||
}
|
||||
|
||||
ULONG __stdcall ClassFactory::AddRef(void)
|
||||
{
|
||||
mWinConsole.writeLine("<ClassFactory::AddRef>");
|
||||
return ++mRefCount;
|
||||
}
|
||||
|
||||
ULONG __stdcall ClassFactory::Release(void)
|
||||
{
|
||||
mWinConsole.writeLine("<ClassFactory::Release>");
|
||||
if(0==--mRefCount)
|
||||
{
|
||||
::delete this;
|
||||
return 0;
|
||||
}
|
||||
return mRefCount;
|
||||
}
|
||||
|
||||
HRESULT __stdcall ClassFactory::CreateInstance(IUnknown *pUnkOuter,REFIID riid,void **ppv)
|
||||
{
|
||||
void *pInstanceItem;
|
||||
|
||||
mWinConsole.writeLine("<ClassFactory::CreateInstance>");
|
||||
*ppv=0;
|
||||
if(0!=pUnkOuter&&riid!=IID_IUnknown)return ComResult::NoAggregation;
|
||||
if(!mpInstantiator)return ComResult::UnExpected;
|
||||
mServer.up();
|
||||
try{pInstanceItem=mpInstantiator->instantiate(pUnkOuter,riid,ppv);}
|
||||
catch(Instantiator::NoInterface){mServer.down();return ComResult::NoInterface;}
|
||||
catch(...){mServer.down();return ComResult::UnExpected;}
|
||||
return ComResult::NoError;
|
||||
}
|
||||
|
||||
long __stdcall ClassFactory::LockServer(int lock)
|
||||
{
|
||||
mWinConsole.writeLine("<ClassFactory::LockServer>");
|
||||
if(lock)mServer.lock();
|
||||
else mServer.unlock();
|
||||
return ComResult::NoError;
|
||||
}
|
||||
|
||||
void ClassFactory::setInstantiator(Instantiator *pInstantiator)
|
||||
{
|
||||
mpInstantiator=pInstantiator;
|
||||
}
|
||||
Reference in New Issue
Block a user