gpt4 book ai didi

c++ - 如何为 C++ COM 事件处理实现接收器?

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:46 26 4
gpt4 key购买 nike

我很难理解使用 COM 时的事件处理。我有一个由第 3 方开发的 COM 对象接口(interface),它应该触发一些事件。我需要从 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 对象代码的内部,因此我一直在尝试查找将要生成事件的位置,但我无法找到任何在逻辑上看起来像是要生成事件的内容。

最佳答案

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

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

关于c++ - 如何为 C++ COM 事件处理实现接收器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31044223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com