c++ - 使用 DispEventAdvise 注册多个对象的事件

标签 c++ com idispatch

我有一个继承自“DispEventAdvise”的类(对于 outlook2010,但它并不重要):

class item_2010_event_handler : 
public IDispEventSimpleImpl<IDC_OUTLOOK_ITEM_2010_EVENTS, 
                            item_2010_event_handler, 
                            &outlook_item_2010_ev_id>

现在,我想注册 item_2010_event_handler 的单个实例以从多个对象获取事件,因此我多次调用 DispEventAdvise()(每个对象一次),但从第二次调用 DispEventAdvise() 时,我得到“未知错误”函数异常。

有没有可能不支持?如果不是,为什么不呢???

如果可能的话,我错过了什么(显然,如果需要,我会添加更多代码...)?

最佳答案

您继承的 IDispEventSimpleImpl 的每个“拷贝”都会保留一个所谓的“cookie”,当您需要取消通知/断开事件连接时,您会在稍后提供回连接点的值。话虽如此,IDispEventSimpleImpl 类(注意名称中的“简单”一词)仅支持一个连接。

您的选择是:

  1. 重写 IDispEventSimpleImpl 类,以便替换类可以连接到多个点,正确管理连接
  2. 为每个连接创建一个连接点接收器类的帮助程序实例,然后将调用转发回所有者,使其从多个来源收集调用 - 推荐
  3. 多次从不同的 IDispEventSimpleImpl 基础继承,以支持单个实例上的更多连接(尽管数量固定 - 缺乏灵 active ,适用于每个源类型一个连接的多个连接)

关于c++ - 使用 DispEventAdvise 注册多个对象的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21096578/

相关文章:

python - 如何从 Python 2.7 在 Windows 中访问 COM

c# - 在 C# 中使用参数打包 IDispatch 调用(使用 DISPPARAMS)

c++ - Visual C++ 中的堆帧有多大

c# - 未从 C# 中找到 C++ COM DLL 中的导出函数

c# - 将 MFC COM 服务器移植到托管代码的最佳方式

internet-explorer - 如何在给定 PID 的情况下找到 IE8 窗口的 IWebBrowser2 指针?

c++ - 如何获取 LPDISPATCH 指针/接口(interface)并将其传递给 activeX 控件

c++ - c++中的唯一/智能指针 vector

c++ - C2679 : binary '<<' : no operator found which takes a right-hand operand of type 'student' (or there is no acceptable conversion)

c++ - 0x523d14cf (msvcr100d.dll) 处未处理的异常?