我在使用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对象代码,因此我一直在尝试查找事件的生成位置,但我无法找到任何逻辑上看起来会生成的内容一个事件。
答案 0 :(得分:1)
我遇到了同样的问题,并找到了一个适用于Embarcadero C ++ Builder的解决方案。我把信息放在这里:Is there a working example of COM event handling in C++ Builder?
我还包含.NET代码来生成生成事件的COM对象 - 可以使用类似的技术来调试事件处理。