問題:
イベント通知(COM オブジェクト - サーバーから) は、シンク (クラス) 実装にリストされているように受信されません。
1 つのイベント通知(Event_one) が受信されますが、その他はそれに応じて受信されません
順序が変更された場合- 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 オブジェクト メソッドは通常どおり呼び出します (インターフェイス ポインターを使用)
- Advise への 1 回の呼び出し
- MIDL コンパイラから生成されたタイプ ライブラリ
たとえば(例):
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;
};