COM学习笔记(九):包容
//Component1是一个实现了两个接口IX和IY的外部组件,但它复用了组件2---组件1所包容的一个内部组件---对IY的实现。 class CA : public IX,public IY{ public: virtual HRESULT __stdcall QueryInterface(const IID& iid,void** ppv); virtual ULONG __stdcall AddRef(); virtual ULONG __stdcall Release(); virtual void __stdcall Fx(){cout<<"Fx"<<endl;} virtual void __stdcall Fy(){m_pIY->Fy();} CA(); ~CA(); HRESULT Init(); private: long m_cRef; IY* m_pIY; }; CA::CA():m_cRef(1),m_pIY(NULL){ InterlockedIncrement(&g_cComponents); } CA::~CA(){ InterlockedDecrement(&g_cComponents); trace("Destroy self."); if(m_pIY != NULL) m_pIY->Release(); } HRESULT CA::Init(){ trace("Create Contained component."); HRESULT hr = ::CoCreateInstance(CLSID_Component2,NULL,CLSCTX_INPROC_SERVER,IID_IY,(void**)&m_pIY); if(FAILED(hr)){ trace("Could not create contained component."); return E_FAIL; } else{ return S_OK; } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //外部组件的类厂调用新创建组件上的Init()函数 HRESULT __stdcall CFactory::CreateInstance(IUnknown* pUnknown,const IID& iid,void** ppv){ if(pUnknown != NULL) return CLASS_E_NOAGGREGATION; CA* pA = new CA; if(pA == NULL) return E_OUTOFMEMORY; HRESULT hr = pA->Init(); if(FAILED(hr)){ pA->Release(); return hr; } hr = pA->QueryInterface(iid,ppv); pA->Release(); return hr ; } //包容的一个主要用途是通过给已有的接口加上一些代码以扩展此接口。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |