_ClassFactoryCreatorClass

来源:互联网 发布:两个移动硬盘对拷数据 编辑:程序博客网 时间:2024/06/05 19:43

#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(){}// IClassFactorySTDMETHOD(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 aggregatingif ((pUnkOuter != NULL) && !InlineIsEqualUnknown(riid)){ATLTRACE(atlTraceCOM, 0, _T("CComClassFactory: asked for non IUnknown interface while creating an aggregated object"));hRes = CLASS_E_NOAGGREGATION;}elsehRes = m_pfnCreateInstance(pUnkOuter, riid, ppvObj);}return hRes;}STDMETHOD(LockServer)(BOOL fLock){if (fLock)_pAtlModule->Lock();else_pAtlModule->Unlock();return S_OK;}// helpervoid 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()// IClassFactorySTDMETHOD(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;elsereturn m_pfnCreateInstance(pUnkOuter, riid, ppvObj);}// IClassFactory2STDMETHOD(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;elsereturn 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;};