#include #include #include ClassFactory::ClassFactory(DLLServer &server,Console &winConsole) : mRefCount(0), mServer(server), mWinConsole(winConsole), mpInstantiator(0) { mWinConsole.writeLine(""); } ClassFactory::~ClassFactory() { mWinConsole.writeLine(""); } HRESULT __stdcall ClassFactory::QueryInterface(REFIID riid,void **ppv) { mWinConsole.writeLine(""); 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(""); return ++mRefCount; } ULONG __stdcall ClassFactory::Release(void) { mWinConsole.writeLine(""); if(0==--mRefCount) { ::delete this; return 0; } return mRefCount; } HRESULT __stdcall ClassFactory::CreateInstance(IUnknown *pUnkOuter,REFIID riid,void **ppv) { void *pInstanceItem; mWinConsole.writeLine(""); *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(""); if(lock)mServer.lock(); else mServer.unlock(); return ComResult::NoError; } void ClassFactory::setInstantiator(Instantiator *pInstantiator) { mpInstantiator=pInstantiator; }