Files
Work/com/hold/factory.cpp
2024-08-07 09:12:07 -04:00

69 lines
1.8 KiB
C++

#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;
}