ATL 事件处理摘要
通常,处理 COM 事件是一个相对简单的过程。 有三个主要步骤:
在对象上实现事件接口。
当对象想要接收事件时,推荐事件源。
当对象不再需要接收事件时取消推荐事件源。
实现接口
使用 ATL 实现接口有四种主要方法。
派生自 | 适用于接口类型 | 要求实现所有方法* | 运行时需要类型库 |
---|---|---|---|
接口 | Vtable | 是 | 否 |
IDispatchImpl | 双 | 是 | 是 |
IDispEventImpl | 调度接口 | 否 | 是 |
IDispEventSimpleImpl | 调度接口 | 否 | 否 |
*使用 ATL 支持类时,无需手动实现 IUnknown
或 IDispatch
方法。
通知和取消通知事件源
可通过三种主要方式使用 ATL 来通知和取消通知事件源。
通知函数 | 取消通知函数 | 最适合用于 | 要求跟踪 Cookie | 注释 |
---|---|---|---|---|
AtlAdvise、CComPtrBase::Advise | AtlUnadvise | Vtable 或双接口 | 是 | AtlAdvise 是全局 ATL 函数。 CComPtrBase::Advise 由 CComPtr 和 CComQIPtr 使用。 |
IDispEventSimpleImpl::DispEventAdvise | IDispEventSimpleImpl::DispEventUnadvise | IDispEventImpl 或 IDispEventSimpleImpl | 否 | 自基类执行更多工作以来,参数比 AtlAdvise 更少。 |
CComCompositeControl::AdviseSinkMap(TRUE) | CComCompositeControl::AdviseSinkMap(FALSE) | 复合控件中的 ActiveX 控件 | 否 | CComCompositeControl::AdviseSinkMap 会通知事件接收器映射中的所有条目。 同一个函数将取消通知条目。 此方法由 CComCompositeControl 类自动调用。 |
CAxDialogImpl::AdviseSinkMap(TRUE) | CAxDialogImpl::AdviseSinkMap(FALSE) | 对话框中的 ActiveX 控件 | 否 | CAxDialogImpl::AdviseSinkMap 通知并取消通知对话资源中的所有 ActiveX 控件。 系统会自动完成。 |