#define DECLARE_CLASSFACTORY() DECLARE_CLASSFACTORY_EX(ATL::CComClassFactory)
#define DECLARE_CLASSFACTORY_EX(cf) typedef ATL::CComCreator< ATL::CComObjectCached< cf > > _ClassFactoryCreatorClass;
class CComClassFactory :
public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>
{
public:
BEGIN_COM_MAP(CComClassFactory)
COM_INTERFACE_ENTRY(IClassFactory)
END_COM_MAP()
virtual ~CComClassFactory()
{
}
// IClassFactory
STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj)
{
ATLASSUME(m_pfnCreateInstance != NULL);
HRESULT hRes = E_POINTER;
if (ppvObj != NULL)
{
*ppvObj = NULL;
// can't ask for anything other than IUnknown when aggregating
if ((pUnkOuter != NULL) && !InlineIsEqualUnknown(riid))
{
ATLTRACE(atlTraceCOM, 0, _T("CComClassFactory: asked for non IUnknown interface while creating an aggregated object"));
hRes = CLASS_E_NOAGGREGATION;
}
else
hRes = m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
}
return hRes;
}
STDMETHOD(LockServer)(BOOL fLock)
{
if (fLock)
_pAtlModule->Lock();
else
_pAtlModule->Unlock();
return S_OK;
}
// helper
void SetVoid(void* pv)
{
m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
}
_ATL_CREATORFUNC* m_pfnCreateInstance;
};
template <class license>
class CComClassFactory2 :
public IClassFactory2,
public CComObjectRootEx<CComGlobalsThreadModel>,
public license
{
public:
typedef license _LicenseClass;
typedef CComClassFactory2<license> _ComMapClass;
BEGIN_COM_MAP(CComClassFactory2<license>)
COM_INTERFACE_ENTRY(IClassFactory)
COM_INTERFACE_ENTRY(IClassFactory2)
END_COM_MAP()
// IClassFactory
STDMETHOD(LockServer)(BOOL fLock)
{
if (fLock)
_pAtlModule->Lock();
else
_pAtlModule->Unlock();
return S_OK;
}
STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter,
REFIID riid, void** ppvObj)
{
ATLASSUME(m_pfnCreateInstance != NULL);
if (ppvObj == NULL)
return E_POINTER;
*ppvObj = NULL;
if (!IsLicenseValid())
return CLASS_E_NOTLICENSED;
if ((pUnkOuter != NULL) && !InlineIsEqualUnknown(riid))
return CLASS_E_NOAGGREGATION;
else
return m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
}
// IClassFactory2
STDMETHOD(CreateInstanceLic)(IUnknown* pUnkOuter,
IUnknown* /* pUnkReserved */, REFIID riid, BSTR bstrKey,
void** ppvObject)
{
ATLASSUME(m_pfnCreateInstance != NULL);
if (ppvObject == NULL)
return E_POINTER;
*ppvObject = NULL;
if ( ((bstrKey != NULL) && !VerifyLicenseKey(bstrKey)) ||
((bstrKey == NULL) && !IsLicenseValid()) )
return CLASS_E_NOTLICENSED;
if ((pUnkOuter != NULL) && !InlineIsEqualUnknown(riid))
return CLASS_E_NOAGGREGATION;
else
return m_pfnCreateInstance(pUnkOuter, riid, ppvObject);
}
STDMETHOD(RequestLicKey)(DWORD dwReserved, BSTR* pbstrKey)
{
if (pbstrKey == NULL)
return E_POINTER;
*pbstrKey = NULL;
if (!IsLicenseValid())
return CLASS_E_NOTLICENSED;
return GetLicenseKey(dwReserved,pbstrKey) ? S_OK : E_FAIL;
}
STDMETHOD(GetLicInfo)(LICINFO* pLicInfo)
{
if (pLicInfo == NULL)
return E_POINTER;
pLicInfo->cbLicInfo = sizeof(LICINFO);
pLicInfo->fLicVerified = IsLicenseValid();
BSTR bstr = NULL;
pLicInfo->fRuntimeKeyAvail = GetLicenseKey(0,&bstr);
::SysFreeString(bstr);
return S_OK;
}
void SetVoid(void* pv)
{
m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
}
_ATL_CREATORFUNC* m_pfnCreateInstance;
};