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

标签 c++ visual-studio-2008 com notifications connection-points

问题:

  • 事件通知(来自 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/

相关文章:

c++ - 消息传递/事件与传统方法调用

visual-studio-2008 - 尽可能减少配置文件的数量

visual-studio - 是否有 Visual Studio 自动保存配置设置?

silverlight - Com Interop 问题 Silverlight 4 和 MS Access 2010

excel - Excel 数据中的变音符号

c# - C# 上的 Windows Phone ANID 到 ANID2 转换?

c++ - 从文件中读取格式化日期 C++

c++ 程序在读取超过 500000 个整数时无法执行

c# - 具有多个控件的 winform 中的事件处理

Delphi插件框架