在MFC中实现 EventSink

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MFC实现 EventSink 。 (1) 在MFC,添加ATL简单对象 CFileMonitorSink (2) 添加继承父类 IDispEventImpl public IDispEventImpl (1) 0 唯一标识符, 用于区别 连接到 事件源的多个客户端 CFileMonitorSink, 当前类名 _IFun1Events, COM 的事件源接口, 包含各种事件 __ATLEventLib, COM Lib类 具体查 MSDN --IDispEventImpl (2) 添加映射项 BEGIN_SINK_MAP(CFileMonitorSink) SINK_ENTRY_EX( 0, __uuidof(_IFun1Events), 1, OnNotify) //0 唯一标识符,用于区别 连接到 事件源的多个客户端 同上 , 1, 事件号 , 发生1号事件 由OnNotify来处理 SINK_ENTRY_EX( 0, __uuidof(_IFun1Events), 2, OnNotify2) //发生2号事件 由OnNotify2来处理 END_SINK_MAP() 并添加方法 STDMETHOD(OnNotify)(void); //事件处理类 STDMETHOD(OnNotify2)(CHAR* lszContent); (3) 连接到COM的事件容器 添加变量 CComPtr m_Object; //COM 的事件源对象 添加方法 STDMETHOD(Start)(IUnknown* pSinkThisObject, VARIANT_BOOL* succeeded) { AFX_MANAGE_STATE(AfxGetAppModuleState()); // TODO: 在此添加实现代码 if ( DispEventAdvise(pSinkThisObject) == S_OK ) { m_Object = pSinkThisObject; *succeeded = VARIANT_TRUE; } else { *succeeded = VARIANT_FALSE; } return S_OK; } STDMETHOD(Stop)(void) //解除连接 { AFX_MANAGE_STATE(AfxGetAppModuleState()); DispEventUnadvise(m_Object); return S_OK; } 在其他类的 使用方法: CComPtr m_FileMonitorSink; CComPtr m_FileMonitor; //COM导出接口 CoInitialize(0); HRESULT lRt = m_FileMonitorSink.CoCreateInstance( __uuidof(FileMonitorSink) ); lRt = m_FileMonitor.CoCreateInstance(__uuidof(Fun1)); //创建COM接口实例 VARIANT_BOOL succeeded; lRt = m_FileMonitorSink->Start(m_FileMonitor, &succeeded); //把 m_FileMonitorSink 连接到COM的事件容器上 m_FileMonitor->HelloWorld(); //调用COM接口,接口触发事件s m_FileMonitorSink->stop(); //从COM接口解除连接 CoUninitialize(); // ################# CFileMonitorSink 类代码 ################# class ATL_NO_VTABLE CFileMonitorSink : public CComObjectRootEx, public CComCoClass, public IDispatchImpl, public IDispEventImpl { public: CFileMonitorSink() { } DECLARE_REGISTRY_RESOURCEID(IDR_FILEMONITORSINK) BEGIN_COM_MAP(CFileMonitorSink) COM_INTERFACE_ENTRY(IFileMonitorSink) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() BEGIN_SINK_MAP(CFileMonitorSink) SINK_ENTRY_EX( 0, __uuidof(_IFun1Events), 1, OnNotify) SINK_ENTRY_EX( 0, __uuidof(_IFun1Events), 2, OnNotify2) END_SINK_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct() { return S_OK; } void FinalRelease() { } CComPtr m_Object; //COM 事件源对象 public: STDMETHOD(OnNotify)(void); STDMETHOD(Stop)(void); STDMETHOD(Start)(IUnknown* pSinkThisObject, VARIANT_BOOL* succeeded); STDMETHOD(OnNotify2)(CHAR* lszContent); };
### 回答1: begin_eventsink_map是一个MFC的一个函数,用于定义事件接收器的映射表。它通常与BEGIN_EVENTSINK_MAP宏一起使用,用于将事件处理函数与事件源进行关联。在MFC框架,事件源可以是窗口控件、文档对象、应用程序等。通过使用begin_eventsink_map函数,可以将事件源的事件与事件处理函数进行映射,使得当事件源触发事件时,相应的事件处理函数会被调用。 ### 回答2: begin_eventsink_map 是一个用于 COM 事件分发器的宏定义,它属于 ATL(Active Template Library)框架,并且是定义在 ATLCom.h 的。该宏定义的作用是创建一个 COM 事件分发器,使得派生自事件分发器的类能够接受事件并将其传递给其它对象。在 COM 组件开发过程,事件分发器是一个很重要的概念,它可以在组件启动异步处理、执行动态链接库(DLL)函数等操作。 begin_eventsink_map 宏定义的使用方法很简单,只需要调用宏并传入派生类的名称,即可在该类开始定义事件表。事件表是由一组事件、事件源和事件处理程序构成的表格,每个表项代表一个事件以及事件响应时的调用函数。 当 begin_eventsink_map 被调用时,事件分发器会自动生成一个名为 get_sink_map() 的静态函数,以获取事件表的引用。利用该引用,我们可以通过向事件表添加表项来为组件定义事件响应。每个表项包含事件 ID、事件源和事件处理函数 3 个部分,事件 ID 是一个唯一的标识符,用于标识事件的类型;事件源用于指定事件发生时的对象,可以是 COM 的任何对象,例如控件、窗口等;事件处理函数则是在事件发生时被调用的函数,对事件进行处理。 总之,begin_eventsink_map 宏定义是 ATL 框架创建 COM 事件分发器的重要工具,它为 COM 组件开发者提供了一种轻便且易用的方式来定义事件响应。通过定义事件表,我们可以使组件能够监听来自其它对象的事件,并在事件发生时执行相应的操作。 ### 回答3: begin_eventsink_map是一种用于事件处理的类方法,可以在COM对象使用。它是用来定义事件处理程序的地方,该处理程序将处理从组件接收到的事件。此方法实际上是用于访问IConnectionPointContainer接口,该接口用于连接一个事件源与一个或多个事件接收器。一个事件源可以作为一个COM对象实现,而一个或多个事件接收器则可以作为客户端对象实现。在实现begin_eventsink_map方法时,通常需要定义事件源的接口,以及事件源所拥有的事件的接口。 在使用begin_eventsink_map进行事件处理时,需要先定义一个IDS结构体,用于表示在派发时会调用的函数。接下来你需要增加一个事件消息映射表,将事件处理程序与这些IDS结构体指定的成员函数进行映射。然后你需要添加函数来实现所有的IDS结构体指定的成员函数,以便当事件发生时,事件消息映射表可以将事件处理程序映射到这些成员函数并执行它们。 总之,begin_eventsink_map是一种在COM对象实现事件处理的有用方法,它允许开发人员将事件源和事件接收器连接起来,从而实现对事件的处理。通过使用这个方法,可以为COM组件添加灵活和可扩展的事件处理,使得组件具有更多的功能和价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blue_Dream_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值