classfac.cpp
#include "headers.h"
// ClassFactory
ClassFactory::ClassFactory()
{
m_cref = 1;
}
ClassFactory::~ClassFactory()
{
}
HRESULT ClassFactory::Create(ClassFactory * * ppFactory)
{
AssertOutPtr(ppFactory);
*ppFactory = new ClassFactory();
if (NULL == *ppFactory)
return E_OUTOFMEMORY;
return S_OK;
}
// IUnknown
STDMETHODIMP ClassFactory::QueryInterface(REFIID riid, void** ppv)
{
if (ppv == NULL)
return E_POINTER;
AssertOutPtr(ppv);
*ppv = NULL;
if (IsEqualIID(riid, IID_IUnknown))
*ppv = (IUnknown *) this;
else if (IsEqualIID(riid, IID_IClassFactory))
*ppv = (IClassFactory *) this;
else
return E_NOINTERFACE;
this->AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) ClassFactory::AddRef(void)
{
return InterlockedIncrement(&this->m_cref);
}
STDMETHODIMP_(ULONG) ClassFactory::Release(void)
{
long cref = InterlockedDecrement(&this->m_cref);
if (0 == cref)
delete this;
return cref;
}
// IClassFactory
STDMETHODIMP ClassFactory::LockServer(BOOL fLock)
{
if (fLock)
DLLAddLock();
else
DLLReleaseLock();
return S_OK;
}
STDMETHODIMP ClassFactory::CreateInstance(IUnknown * punkOuter, REFIID riid, void * * ppv)
{
HRESULT hr;
ScriptEngine * pEngine = NULL;
if (NULL == ppv)
return E_POINTER;
AssertOutPtr(ppv);
*ppv = NULL;
// The engine does not support aggregation
if (NULL != punkOuter)
return E_INVALIDARG;
hr = ScriptEngine::Create(&pEngine);
if (FAILED(hr))
goto LError;
hr = pEngine->QueryInterface(riid, ppv);
if (FAILED(hr))
goto LError;
hr = S_OK;
LError:
if (NULL != pEngine)
pEngine->Release();
return hr;
}