【发布时间】: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方法