【问题标题】:Receiving COM events接收 COM 事件
【发布时间】:2009-01-18 11:29:50
【问题描述】:

没有:

  • ATL
  • MFC

注意:

  • 普通 C++
  • 进程外 COM 对象/服务器
  • 预定义的 TLB 文件

问题:

  • 如何实现一个传出接口,使COM Object可以通知sink事件?
  • 一旦收到事件,如何正确处理?

以下是我要实现的事件函数 - 来自 TLB 文件:

inline HRESULT IS8SimulationEvents::S8SimulationEndRun ( ) {
    HRESULT _result = 0;
    _com_dispatch_method(this, 0x2, DISPATCH_METHOD, VT_ERROR, (void*)&_result, NULL);
    return _result;
}

问候

【问题讨论】:

    标签: c++ com event-handling


    【解决方案1】:

    在 COM Server 类中实现源接口。 如果你不使用 ATL,你应该实现 IConnectionPointcontainer。

    在客户端类中调用 COM 服务器,如下所述。 1.调用FindConnectionPointContainer 2.调用FindConnectionPoint 3.对第2步返回的接口指针调用Advise,我们要提供Sink对象的IUnknown指针。 Advise 返回一个 cookie,我们可以在调用 unadvise 时使用它。

    要处理事件,您可以通过 2 种方式进行 一种使用 IDispatch 的 Invoke 方法来解决客户端中的调用 另一个是服务器本身调用特定的 Sink 方法。这两种方法都使用它在建议时获得的 IUnknown 指针。

    【讨论】:

    • 如何确认 COM 对象已经有源接口?我正在使用预定义的 TLB 文件。
    • 找到“dispinterface IS8SimulationEvents”-helpstring(“S8Simulation 对象的事件接口”)。是这个吗?
    • 通常带有“Events”的接口是sink接口,意思是“应该由客户端实现”,在这个接口之上的接口是源接口
    • 好的,所以我将尝试从客户端实现 IS8SimulationEvents - 接收器接口。对不起,请原谅我还是不明白:接口 IS8Simulation - 在上面(在 OLEVIEW 中)
    • OleView 是一个微软的应用程序,用于查看所有 COM 组件,它们的接口在您的计算机中注册。如果您的 COM 服务器已注册,那么它应该列在 OleView 中。
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 2015-09-11
    • 2011-03-14
    • 2014-07-02
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多