gpt4 book ai didi

c++ - 未按描述收到事件通知

转载 作者:行者123 更新时间:2023-11-28 08:33:59 27 4
gpt4 key购买 nike

问题:

  • 事件通知(来自 COM 对象 - 服务器)未收到,如接收器(类)实现中所列。

  • 一个事件通知收到 (Event_one),但是,其他没有相应地收到

  • 如果 order改变 - 在 IDispatch::Invoke 中,即:

    • 如果 Event_one 被交换为 Event_twoEvent_two 收到通知,但 Event_one 和其他人相应地被忽略

问题:

  • 更好的实现方式,IDispatch::Invoke 还是 QI?
  • 使用了错误的逻辑或方法?

注意:

  • 没有 MFC
  • 没有 ATL
  • 纯 C++
  • 使用消息循环:GetMessage()
  • STA 模型 ( Coinitialize() )
  • 调用 IDispatch::Advise 成功(调用 S_OK 的 HRESULT)
  • 在上面之后,COM 对象方法正常调用(使用接口(interface)指针)
  • 一次调用 Advise
  • MIDL compiler 生成的类型库

例如(例子):

IDispatch::Invoke 的插图 - 取自Sink 类:

HRESULT STDMETHODCALLTYPE Invoke(
{
//omitted parameters

// The riid parameter is always supposed to be IID_NULL
if (riid != IID_NULL)
return DISP_E_UNKNOWNINTERFACE;

if (pDispParams) //DISPID dispIdMember
{
switch (dispIdMember) {
case 1:
return Event_one();
case 2:
return Event_two();
case 3:
return Event_three();
default:
return E_NOTIMPL;
}
}
return E_NOTIMPL;
}

QueryInterface 的说明:

STDMETHOD (QueryInterface)(
//omitted parameters
{
if (iid == IID_IUnknown || iid == __uuidof(IEvents))
{
*ppvObject = (IEvents *)this;
} else {
*ppvObject = NULL;
return E_NOINTERFACE;
}
m_dwRefCount++;
return S_OK;
};

最佳答案

由于您正在接收接收器接口(interface)的第一个方法的通知,我怀疑事件不会在服务器的其他方法上发送。如果您有服务器代码,只需检查抛出通知的连接点类。

您还可以在客户端应用程序的 Invoke 方法中放置一个断点,以检查它正在接收的所有事件。

关于c++ - 未按描述收到事件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/521824/

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