(精品)09-1可连接对象 (2).ppt

上传人:hyn****60 文档编号:70981508 上传时间:2023-01-31 格式:PPT 页数:26 大小:200.50KB
返回 下载 相关 举报
(精品)09-1可连接对象 (2).ppt_第1页
第1页 / 共26页
(精品)09-1可连接对象 (2).ppt_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《(精品)09-1可连接对象 (2).ppt》由会员分享,可在线阅读,更多相关《(精品)09-1可连接对象 (2).ppt(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、COM:可连接对象潘爱民2003-11-7http:/ object)l内容:内容:可连接对象结构模型可连接对象结构模型实现可连接对象实现可连接对象(源对象源对象)客户客户-源对象源对象-接收器的协作过程接收器的协作过程可连接对象的程序实现可连接对象的程序实现双向通信机制 客户与可连接对象的关系两个概念l入接口入接口(incoming interface)组件对象实现入接口,客户通过入接口调用对象提组件对象实现入接口,客户通过入接口调用对象提供的功能供的功能客户和组件都需要知道接口的类型信息客户和组件都需要知道接口的类型信息l出接口出接口(outgoing interface)客户端提供的客户

2、端提供的COM对象实现出接口对象实现出接口组件端的对象通过出接口调用客户提供的功能组件端的对象通过出接口调用客户提供的功能组件提供接口类型信息,客户实现该接口组件提供接口类型信息,客户实现该接口类似于回调类似于回调(callback),但是要复杂和灵活得多但是要复杂和灵活得多出接口l类型信息由组件一方提供类型信息由组件一方提供l客户提供出接口的实现,实现出接口的客户提供出接口的实现,实现出接口的COM对对象被称为接收器对象象被称为接收器对象(sink)sink没有没有CLSID,也不需要类厂也不需要类厂l也是一个也是一个COM接口,有接口,有IIDl每个成员函数代表了:每个成员函数代表了:事件

3、事件event通知通知notification请求请求request源对象 or 可连接对象lConnectable object,sourcel普通的普通的COM对象,支持一个或者多个出对象,支持一个或者多个出接口接口l提供出接口的类型信息提供出接口的类型信息通过通过IProvideClassInfo2接口接口通过通过typelib客户与可连接对象之间的两种结构可连接对象的基本结构可连接对象l如何管理多个出接口如何管理多个出接口每个出接口对应一个连接点对象每个出接口对应一个连接点对象通过连接点枚举器管理通过连接点枚举器管理l对于每个出接口,如何管理多个客户连对于每个出接口,如何管理多个客户连

4、接接通过连接枚举器管理多个连接通过连接枚举器管理多个连接实现可连接对象(源对象)(一)l枚举器枚举器内部对象,不需要类厂和内部对象,不需要类厂和CLSID其含义就如同指针其含义就如同指针智能指针智能指针枚举器接口模板枚举器接口模板class IEnum:public IUnknownvirtual HRESULT Next(ULONG celt,ELT_T*rgelt,ULONG*pceltFetched)=0;virtual HRESULT Skip(ULONG celt)=0;virtual HRESULT Reset(void)=0;virtual HRESULT Clone(IEnum

5、*ppenum)=0;枚举器的用法class IStringManager:public IUnknown virtual IEnumString*EnumStrings(void)=0;void SomeFunc(IStringManager*pStringMan)String psz;IEnumString*penum;penum=pStringMan-EnumStrings();while(S_OK=penum-Next(1,&psz,NULL)/Do something with the string in psz and free it penum-Release();return;

6、实现可连接对象(源对象)(二)lIConnectionPointContainer接口接口class IConnectionPointContainer:public IUnknown virtual HRESULT EnumConnectionPoints(IEnumConnectionPoints*)=0;virtual HRESULT FindConnectionPoint(const IID*,IConnectionPoint*)=0;lIEnumConnectionPoints接口接口class IEnumConnectionPoints:public IUnknownvirtual

7、 HRESULT Next(ULONG cConnections,IConnectionPoint*rgpcn,ULONG*pcFetched)=0;virtual HRESULT Skip(ULONG cConnections)=0;virtual HRESULT Reset(void)=0;virtual HRESULT Clone(IEnumConnectionPoints*ppEnum)=0;实现可连接对象(源对象)(三)l连接点和连接点和IConnectionPoint接口接口class IConnectionPoint:public IUnknown virtual HRESULT

8、 GetConnectionInterface(IID*pIID)=0;virtual HRESULT GetConnectionPointContainer(IConnectionPointContainer*ppCPC)=0;virtual HRESULT Advise(IUnknown*pUnk,DWORD*pdwCookie)=0;virtual HRESULT Unadvise(DWORD dwCookie)=0;virtual HRESULT EnumConnections(IEnumConnections*ppEnum)=0;l连接枚举器连接枚举器 实现实现IEnumConnec

9、tions接口接口允许多个客户连接允许多个客户连接每个连接用每个连接用struct CONNECTDATA来描述来描述回顾:可连接对象的基本结构客户与源对象建立连接过程l客户请求客户请求IConnectionPointContainer接口接口l客户调用客户调用IConnectionPointContainer:FindConnectionPoint找到连接点对象找到连接点对象l客户调用客户调用IConnectionPoint:Advise建立与接建立与接收器的连接收器的连接l最后,客户调用最后,客户调用IConnectionPoint:Unadvise取消连接,并取消连接,并释放连接点对象释

10、放连接点对象客户方基本结构l客户方实现接收器对象客户方实现接收器对象(sink)支持多个与可连接对象之间的连接支持多个与可连接对象之间的连接一般只实现专用的出接口(一般只实现专用的出接口(IUnknown除外)除外)不需要类厂、不需要类厂、CLSID与客户代码紧密连接起来与客户代码紧密连接起来l建立连接建立连接1 通过通过IConnectionPointContainer接口找到连接接口找到连接点对象点对象2 通过连接点对象建立连接通过连接点对象建立连接连接点相当于连接管理器连接点相当于连接管理器接收器的实现class CSomeEventSet:public ISomeEventSet pr

11、ivate:ULONG m_cRef;/Reference count ./other private data members public:DWORD m_dwCookie;/Connection key public:CSomeEventSet();CSomeEventSet(void);/IUnknown members STDMETHODIMP QueryInterface(REFIID,PPVOID);STDMETHODIMP_(DWORD)AddRef(void);STDMETHODIMP_(DWORD)Release(void);STDMETHODIMP SomeEventFu

12、nction(.);.;接收器的用法ISomeEventSet*gpSomeEventSet;./InitializeCSomeEventSet*pSink=new CSomeEventSet;pSink-QueryInterface(IID_ISomeEventSet,pSomeEventSet);/Reference count is 1./connections the sink object to the connectable object we havehr=pConnectionPoint-Advise(pSomeEventSet,&pSomeEventSet-m_dwCooki

13、e);./disconnections the sink object from the connectable object we havehr=pConnectionPoint-Unadvise(pSomeEventSet-m_dwCookie);./UninitializepSink-Release();/Reference count is 0事件的激发和处理BOOL CSourceObject:FireSomeEvent(IConnctionPoint*pConnectionPoint)IEnumConnections *pEnum;CONNECTDATA connectionDat

14、a;if(FAILED(pConnectionPoint-EnumConnections(&pEnum)return FALSE;while(pEnum-Next(1,&connectionData,NULL)=NOERROR)ISomeEventSet *pSomeEventSet;if(SUCCEEDED(connectionData.pUnk-QueryInterface(IID_ISomeEventSet,(PPVOID)&pSomeEventSet)pSomeEventSet-SomeEventFunction();/Trigger event or request pSomeEve

15、ntSet-Release();pEnum-Release();return TRUE;与出接口有关的类型信息l客户如何知道出接口?运行时刻?编译时刻?客户如何知道出接口?运行时刻?编译时刻?l动态构造接收器对象?动态构造动态构造接收器对象?动态构造vtable?支持支持部分成员?部分成员?l类型信息的协商类型信息的协商通过通过IProvideClassInfo2l能否用标准的接口作为出接口?能否用标准的接口作为出接口?用IDispatch接口作为出接口(一)lIDispatch接口接口class IDispatch:public IUnknown public:virtual HRESULT

16、 GetTypeInfoCount(UINT*pctinfo)=0;virtual HRESULT GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo*ppTInfo)=0;virtual HRESULT GetIDsOfNames(REFIID riid,LPOLESTR*rgszNames,UINT cNames,LCID lcid,DISPID*rgDispId)=0;virtual HRESULT Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS*pDisp

17、Params,VARIANT*pVarResult,EXCEPINFO*pExcepInfo,UINT*puArgErr)=0;用IDispatch接口作为出接口(二)IDispatch出接口的事件激发函数void CMySourceObj:FireMyMethod(short nInt)COleDispatchDriver driver;POSITION pos=m_xMyEventSet.GetStartPosition();LPDISPATCH pDispatch;while(pos!=NULL)pDispatch=(LPDISPATCH)m_xMyEventSet.GetNextCon

18、nection(pos);ASSERT(pDispatch!=NULL);driver.AttachDispatch(pDispatch,FALSE);TRYdriver.InvokeHelper(eventidMyMethod,DISPATCH_METHOD,VT_EMPTY,NULL,(BYTE*)(VTS_I2),nInt);END_TRYdriver.DetachDispatch();用连接点机制实现回调的讨论l比传统的回调函数比传统的回调函数功能强大,灵活功能强大,灵活可以跨进程、跨机器可以跨进程、跨机器lTightly coupled vs loosely coupled(COM+)要求客户与组件同步要求客户与组件同步没有第三方的参与,所以双方必须保持共识没有第三方的参与,所以双方必须保持共识VB中使用出接口l使用浏览器控件的事件函数使两个窗口使用浏览器控件的事件函数使两个窗口同步同步

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁