如何实现C ++ COM事件处理的接收器?

时间:2015-06-25 07:46:05

标签: c++ events com

我在使用COM时难以理解事件处理。我有一个由第三方开发的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对象代码,因此我一直在尝试查找事件的生成位置,但我无法找到任何逻辑上看起来会生成的内容一个事件。

1 个答案:

答案 0 :(得分:1)

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

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