0

问题:

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

  • 接收到一个事件通知( Event_one ),但未相应接收其他事件通知

  • 如果更改顺序-在IDispatch::Invoke 中,即:

    • ifEvent_one被交换到Event_twothenEvent_two收到通知,但Event_one其他人相应地被忽略

问题:

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

注意

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

例如(示例):

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

查询接口说明

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

2 回答 2

1

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

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

于 2009-02-07T06:21:56.420 回答
0

解决了:

在查看了相应的IDL文件(由 MIDL 编译器生成)之后,很明显IEvent接口中包含的每个方法都有一个唯一的 ID。例如,ID 为2。例如:Event_one

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

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

//omitted


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

//omitted 

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

于 2009-02-08T23:48:48.773 回答