未按所述方式收到事件通知

时间:2009-02-06 19:34:17

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

问题:

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

  • 一个事件通知 已收到(Event_one),但是其他人

  • >
  • 如果订单 已更改 - 在IDispatch :: Invoke中,即:

    • 如果Event_oneEvent_two交换,则收到Event_two通知,但Event_one和其他人则相应地忽略了

问题:

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

注意

  • 没有MFC
  • 没有ATL
  • 纯C ++
  • 使用消息循环:GetMessage()
  • STA 模型(Coinitialize())
  • 致电IDispatch ::建议成功(HRESULT来自 S_OK
  • 上面,COM对象方法正常调用(带接口指针)
  • 单独致电Advise
  • MIDL compiler
  • 生成的类型库

例如(示例):

IDispatch :: Invoke 的插图 - 取自接收器类

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

解决:

在查看相应的 IDL 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 

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