代码之家  ›  专栏  ›  技术社区  ›  Aaron

未按所述收到事件通知

  •  0
  • Aaron  · 技术社区  · 16 年前

    问题:

    • 事件通知 (来自COM对象-服务器)未收到Sink(类)实现中列出的信息。

    • 一个事件通知 被承认的 (Event_one),然而,其他人 收到相应

    • 如果 顺序 变化大的 -在IDispatch::Invoke中,即:

      • 如果 Event_one 被替换为 Event_two 然后 事件_ 2 收到通知,但 活动_一个 而其他人则相应地被忽视了

    问题:

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

    笔记 :

    • 无MFC
    • 无ATL
    • 纯C++
    • 使用消息循环: GetMessage()
    • STA 模型(Coinitialize())
    • 调用IDispatch::建议 成功的 (来自调用的HRESULT S_OK )
    • 在上面之后,COM对象方法正常调用(使用接口指针)
    • 单一电话咨询
    • 类型库生成自 MIDL compiler

    例如(示例):

    的图解 IDispatch::调用 -取自 水槽等级 :

    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;
    }
    

    的图解 查询接口:

    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;
    };
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Vinay    16 年前

    我怀疑,由于您收到了接收器接口第一个方法的通知,因此事件不会从服务器通过其他方法发送。如果你有服务器的代码,只需检查抛出通知的连接点类。

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

        2
  •  0
  •   Aaron    16 年前

    解决了的:

    在审查了相应的 接口定义语言 FILE(由MIDL编译器生成),很明显,每个 方法 包含在 IEvent 接口,具有 唯一ID 例如, Event_one ID为 2. 例如:

    methods:
        [id(0x00000002)]
        HRESULT Event_one();
    

    因此,在IDispatch::invoke实现中进行如下更改(如上述问题所示):

    //omitted
    
    
    if (pDispParams) //DISPID dispIdMember
            {
                switch (dispIdMember) { 
                case 2:
                        return Event_one();
    
    //omitted 
    

    现在,当相应地调用时,所需的/正确的 方法 现在 执行。