| STDMETHODIMP CmyInterface::QueryInterface(REFIID riid,LPVOID *ppv) { *ppv = NULL; if(IsEqualIID(riid,IID_IUnknown) || IsEqualIID(riid,__uuidof(ImyInterface))) { // 因为我们从ImyInterface继承,所以要进行强制类型转换 *ppv = (ImyInterface *) this; _AddRef(); // 这个方法从某个基类继承而来 return S_OK; } return E_NOINTERFACE; } STDMETHODIMP CmyInterface::Square(long *pVal) { long value = *pVal; *pVal = value * value; return S_OK; } STDMETHODIMP CmyInterface::Cube(long *pVal) { long value = *pVal; *pVal = value * value * value; return S_OK; } |
| STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut) { *ppvOut = NULL; if (IsEqualIID(rclsid, CLSID_Mine)) { // 为CmyInterface类声明类工厂 CClassFactory<CmyInterface> *pcf = new CClassFactory<CmyInterface>; return pcf->QueryInterface(riid,ppvOut); } return CLASS_E_CLASSNOTAVAILABLE; } |
| // CSingleCreator 用于单实例类工厂,这个类为多个CreateObject请求返回相同的对象指针.. template<class comObj> class CSingleCreator { protected: CSingleCreator():m_pObj(0) {}; comObj *CreateObject() { if(!m_pObj) { m_pObj = new comObj; } return m_pObj; } comObj * m_pObj; }; // CMultiCreator 用于常用类工厂,这个类为每一个CreateObject请求返回新的对象指针.. template<class comObj> class CMultiCreator { protected: CMultiCreator():m_pObj(0) {}; comObj *CreateObject() { return new comObj; } comObj * m_pObj; }; //ClassFactory类实现 // MultiCreator是缺省的类工厂创建者 //这个类实现了接口IclasFactory...... class CClassFactory : public CComBase<>, public InterfaceImpl<IClassFactory>, public creatorClass { public: CClassFactory() {}; virtual ~CClassFactory() {}; STDMETHOD(QueryInterface)(REFIID riid,LPVOID *ppv) { *ppv = NULL; if(IsEqualIID(riid,IID_IUnknown) || IsEqualIID(riid,IID_IClassFactory)) { *ppv = (IClassFactory *) this; _AddRef(); return S_OK; } return E_NOINTERFACE; } STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj) { *ppvObj = NULL; if (pUnkOuter) return CLASS_E_NOAGGREGATION; m_pObj = CreateObject(); // m_pObj 在creatorClass中定义 if (!m_pObj) return E_OUTOFMEMORY; HRESULT hr = m_pObj->QueryInterface(riid, ppvObj); if(hr != S_OK) { delete m_pObj; } return hr; } STDMETHODIMP LockServer(BOOL) { return S_OK; } // 未实现 }; |