问题:
事件通知(来自COM对象 - 服务器)未收到Sink(类)实现中列出的内容。
一个事件通知 已收到(Event_one),但是其他人
如果订单 已更改 - 在IDispatch :: Invoke中,即:
Event_one
与Event_two
交换,则收到Event_two
通知,但Event_one
和其他人则相应地忽略了问题:
注意:
例如(示例):
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;
};
答案 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
现在,当相应地调用时,所需/正确的方法 现在已执行。