com:可连接对象结构化存储内容摘要:

VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) = 0。 }。 用 IDispatch接口作为出接口 (二 ) 客户把接收器接口指针传给对象客户接收器源对象客户获取出接口的类型信息源对象调用In v o k e 成员函数ID isp a tc hIP r o v id e Clas sI n f o连接点对象IDispatch出接口的事件激发函数 void CMySourceObj::FireMyMethod (short nInt) { COleDispatchDriver driver。 POSITION pos = ()。 LPDISPATCH pDispatch。 while (pos != NULL) { pDispatch = (LPDISPATCH) (pos)。 ASSERT(pDispatch != NULL)。 (pDispatch, FALSE)。 TRY (eventidMyMethod, DISPATCH_METHOD, VT_EMPTY, NULL, (BYTE *) (VTS_I2), nInt)。 END_TRY ()。 } } 用连接点机制实现回调的讨论 比传统的回调函数 –功能强大,灵活 –可以跨进程、跨机器  Tightly coupled vs loosely coupled (COM+) –要求客户与组件同步 –没有第三方的参与,所以双方必须保持共识 MFC对连接和事件的支持 源对象 ( C C m dT ar get 派生类 )m _ x Co n n P tCo n tain e r出接口 1I Co n n e c ti o n P o i n tCo n tain e r调用 E n a b leCo n n e c ti o n s 进行初始化连接映射表G e tE x traCo n n e c ti o n P o i n ts 函数指定内置连接点枚举器连接点对象 1出接口 2出接口 n连接点对象 2连接点对象 n事件 1事件 2……事件 n事件激发函数激发事件或请求:在特定的连接点上,对所有的连接向接收器发送事件或请求枚举连接点发送事件或请求:调用 In v o k e 函数用 MFC实现源对象  创建工程 —— 支持 COM  定义出接口 —— 编辑 .odl文件  利用 MFC宏加入连接点声明以及连接点对象的定义  在对象构造函数中调用 EnableConnections()。  在接口映射表中加入接口IConnectionPointContainer的表项,再加入连接映射表  定义连接点类的虚函数 (至少为 GetIID)  加入事件激发函数 用 MFC在客户程序中实现接收器 初始化 —— AfxOleInit 定义出接口成员类 实现出接口成员类 创建源对象 建立连接和取消连接 完成可触发事件的动作 用 MFC实现的例子 ATL实现可连接对象  在 IDL中 – 定义一个用作出接口的 automation接口 – 在 coclass中加入出接口,含 source属性  增加 IConnectionPointContainer接口 – 在基类列表中增加 – IConnectionPointConntainerImplCMyClass – 在 COM MAP中加入 – COM_INTERFACE_ENTRY(IConnectionPointConntainer) 模板类 IConnectionPointImpl  CMyClass继承 IConnectionPointImpl一次或多次 – IConnectionPointImpl实现了独立的引用计数 – 用法:在基类列表中增加 – IConnectionPointImplCMyClass, amp。 DIID__IEventSet  加入 connection point map,如下 BEGIN_CONNECTION_POINT_MAP(CMyClass) CONNECTION_POINT_ENTRY(DIID__IEventSet) END_CONNECTION_POINT_MAP() 激发事件辅助函数  手工激发事件 – IConnectionPointImpl包含一个 m_vec成员,内含所有已经建立的接收器连接 – 遍历 m_vec数组,逐一调用 Invoke函数  利用 VC IDE提供的源码产生工具 – ATL连接点代理生成器,启动对话框 Implement Connection Point – 产生名为 CProxy_SinkInterfaceName的模板类 • 例如 CProxy_IEventSet,它从 IConnectionPointImpl派生 • 对于每一个事件或者请求,都有一个对应的 Fire_Xxx成员函数 – 用模板类代替 IConnectionPointImpl基类 Implement Connection Point对话框  创建对象时选择 Connection Point  ClassView中,在对象类上右键点击选择此项功能 ATL实现连接点:最后的工作  在需要激发事件的地方 – 调用 CProxy_Xxxx提供的辅助函数  增加对 IProvideClassInfo2接口的支持 – 需要 typelib的支持 – 加入基类 IProvideClassInfo2Impl – 在 COM MAP中加入: – COM_INTERFACE_ENTRY(IProvideClassInfo2) – COM_INTERFACE_ENTRY(IProvideClassInfo) ATL实现接收器 sink  IDispEventSimpleImpl – 轻量,不需要 typelib的支持  IDispEventImpl – 需要 typelib的支持  Event Sink Map BEGIN_SINK_MAP(CMyCLass) SINK_ENTRY_EX(...) // 适合用于 nonUI object SINK_ENTRY(...) // 适合用于 UI object END_SINK_MAP ATL:建立 sink和 source之间的连接  IDispEventSimpleImpl成员 – DispEventAdvise – DispEventUnadvise  AtlAdviseSinkMap –建立 sink与 source缺省源接口的连接 VB中使用出接口 使用浏览器控件的事件函数使两个窗口同步。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。