聚合模型 对象B 客户程序 调用 IOtherlnterfacel 传递 调用 对象A ISomelnterfacel
聚合模型 对象 B IOtherInterface 对象 A ISomeInterface 客户程序 调用 传递 调用
聚台模型说明 聚合对象和被聚台对象物同工作 客户直接与内部对象交互,但它并不知道 IUnknown唯一性是COM的基本要求 重用钳对某个接口而言,聚合和包容并不 矛盾,在一个对象上可以同时使用 φ聚合和包容的选择策略
聚合模型说明 !聚合对象和被聚合对象协同工作 聚合对象和被聚合对象协同工作 !客户直接与内部对象交 客户直接与内部对象交 互,但它并 不知道 !IUnknown IUnknown 唯一性是COM的基本要求 !重用 针 对 某个接口而 言,聚合和包容 并 不 矛盾,在一个对象上可以同时使用 ,在一个对象上可以同时使用 !聚合和包容的选 聚合和包容的选择策略
包容模型实现 定义接囗 class ISomelnterface public IUnknown virtual HRESULT stdcall SomeFunction(=0 Class IotherInterface: public IUnknown public: virtual HRESULT stdcall Other Function(=0; }
包容模型实现 !定义接口: class ISomeInterface ISomeInterface : public : public IUnknown IUnknown { public: public: virtual HRESULT __ virtual HRESULT __stdcall SomeFunction stdcall SomeFunction() = 0; () = 0; }; class IOtherInterface IOtherInterface : public : public IUnknown IUnknown { public: public: virtual HRESULT __ virtual HRESULT __stdcall OtherFunction stdcall OtherFunction() = 0; () = 0; };
class CB public ISomeInterface, public IotherInterface 包容 protected: ULONG 作部对 public: CB OH 定Xm0he erface(const IID& iid, void **ppv) ULONG stdcall AddRefOr ULONG stdcall Release i //ISomeInterface members HRESULT stdcall Some Functionoi /IOtherInterface members HRESULT stdcall OtherFunction() HRESULT InitOF private ISomeInterface *m_pSomeInterface;
包容: 外部对 象定义 class CB : public class CB : public ISomeInterface ISomeInterface , public , public IOtherInterface IOtherInterface { protected: protected: ULONG m_Ref; ULONG m_Ref; public: public: CB ( ); CB ( ); ~ CB (); ~ CB (); HRESULT __ HRESULT __stdcall QueryInterface stdcall QueryInterface(const IID& (const IID& iid, void ** , void **ppv); ULONG __ ULONG __stdcall AddRef stdcall AddRef(); ULONG __ ULONG __stdcall stdcall Release(); Release(); //ISomeInterface ISomeInterface members members HRESULT __ HRESULT __stdcall SomeFunction stdcall SomeFunction( ) ; //IOtherInterface IOtherInterface members members HRESULT __ HRESULT __stdcall OtherFunction stdcall OtherFunction( ) ; HRESULT Init(); HRESULT Init(); private : private : ISomeInterface ISomeInterface *m_pSomeInterface pSomeInterface; };
包容:外部对象的实现 CBH CBO m_psomeInterface= NULLI I Ref= Or CBHNCB( if(m-pSomeInterface NULL m_psomeInterface->Released HRESULT CB: InitO HRESULT result = CoCreateInstance(CLSID_ComponentA, NULL CLSCTX_ INPROC_ SERVER, IID_ISomeInterface (void *x)&m_-pSomeInterface)i if(FAILED(result)) return E_FAIL els return S_OK
包容:外部对象的实现 包容:外部对象的实现 CB::CB ( ) CB::CB ( ) { m_pSomeInterface pSomeInterface = NULL; = NULL; m_Ref = 0; m_Ref = 0; } CB::~CB ( ) CB::~CB ( ) { if (m_pSomeInterface pSomeInterface ! = NULL) ! = NULL) m_pSomeInterface pSomeInterface->Release() ; ->Release() ; } HRESULT HRESULT CB::Init() CB::Init() { HRESULT result = :: HRESULT result = ::CoCreateInstance CoCreateInstance(CLSID_ (CLSID_ComponentA, NULL, , NULL, CLSCTX_INPROC_SERVER, IID_ CLSCTX_INPROC_SERVER, IID_ISomeInterface ISomeInterface, (void **)&m_ (void **)&m_pSomeInterface pSomeInterface) ; if (FAILED(result)) if (FAILED(result)) return E_FAIL; return E_FAIL; else return S_OK; return S_OK; }