0

問題:

  • イベント通知(COM オブジェクト - サーバーから) は、シンク (クラス) 実装にリストされているように受信されません。

  • 1 つのイベント通知(Event_one) が受信されますが、その他はそれ応じて受信されません

  • 順序変更された場合- IDispatch::Invoke では、次のようになります。

    • Event_oneに交換された場合Event_twoEvent_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;
};
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 に答える