【问题标题】:How to implement sink for C++ COM event handling?如何为 C++ COM 事件处理实现接收器?
【发布时间】:2015-09-11 16:45:45
【问题描述】:

我在使用 COM 时很难理解事件处理。我有一个由第 3 方开发的 COM 对象接口,它应该触发一些事件。我需要从 C++ 应用程序处理这些事件。到目前为止,我有以下代码来设置事件:

事件设置 (Main.cpp)

 IConnectionPointContainer* connection;
 result = comObjectInterface->QueryInterface(IID_IConnectionPointContainer, (void**)&connection);
 IConnectionPoint* connectionPoint;
 connection->FindConnectionPoint(__uuidof(_ICOMObjectInterfaceEvents), &connectionPoint);
 EventSink* sink = new EventSink();
 DWORD cookie = 0;
 connectionPoint->Advise(sink, &cookie);

我的问题是我不知道如何实现EventSink?我见过人们创建了一个简单的类来扩展某种形式的 IDispatch 实现,但我似乎没有这个实现可用,而且我找不到任何关于如何创建自己的实现的像样的例子。目前我的 EventSink 上有两种方法,我知道它们会被调用:

EventSink.cpp

HRESULT __stdcall EventSink::QueryInterface(REFIID riid, void **ppv)
{
   *ppv = nullptr;
   HRESULT hr = E_NOINTERFACE;
   if (riid == IID_IUnknown || riid == IID_IDispatch ||
      riid == __uuidof(_ICOMObjectInterfaceEvents))
   {

      *ppv = static_cast<_ICOMObjectInterfaceEvents *>(this); //(static_cast<IDispatch*>(this));
      AddRef();
      hr = S_OK;
   }
   return hr;
}

ULONG __stdcall EventSink::AddRef()
{
   return InterlockedIncrement(&m_cRef);
}

我不确定这些方法是否正常工作。

另外,我该如何调试呢?我能够查看 COM 对象代码内部,因此我一直在尝试查找将从何处生成事件,但我无法找到任何逻辑上看起来会生成事件的内容。

【问题讨论】:

  • 看起来是一个好的开始,现在您在EventSink 中添加实际的IDispatch 方法

标签: c++ events com


【解决方案1】:

我遇到了同样的问题,并找到了一个适用于 Embarcadero C++ Builder 的解决方案。我把信息放在这里:Is there a working example of COM event handling in C++ Builder?

我还包含 .NET 代码以生成生成事件的 COM 对象 - 可以使用类似的技术来调试事件处理。

【讨论】:

    猜你喜欢
    • 2017-02-04
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多