问题:
事件通知(来自 COM 对象 - 服务器)未收到,如接收器(类)实现中所列。
一个事件通知被收到 (Event_one),但是,其他没有相应地收到
如果 order 被改变 - 在 IDispatch::Invoke 中,即:
- 如果
Event_one
被交换为Event_two
则Event_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/