0

dispinterface _QuoteEvents を持つ COM Quote クラスがあります。イベント処理には、次の手順を使用します。

IDispEventSimpleImpl から派生したイベント シンク クラス:

class CProxyQuoteEvents : public IDispEventSimpleImpl<SINK_ID, CProxyQuoteEvents, &__uuidof(_IQuoteEvents)> {
....
}

COM ライブラリの初期化とオブジェクトの作成とアドバイス:

CProxyQuoteEvents g_quoteEventsProxy;
QuotePtr g_quote;

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
g_quote.CreateInstance(__uuidof(Quote));
g_quoteEventsProxy.DispEventAdvise(g_quote, &__uuidof(_IQuoteEvents));

これらの構造はすべてうまく機能します (イベントは期待どおりに処理されます) が、他のより高速な解決策があるかどうかを知りたいですか? ATL を回避した方が速い場合は、ATL がなくても実現できるのではないでしょうか。

また、違いがある場合は説明してください

class ATL_NO_VTABLE CSimple : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSimple, &CLSID_Simple>,
public IDispatchImpl<ISwitch, &IID_ISwitch, &LIBID_DISPEVENTLib>,
public IDispEventSimpleImpl</*nID =*/ 1, CSimple, &__uuidof(Word::ApplicationEvents)>

class CSimple :    
public IDispEventSimpleImpl</*nID =*/ 1, CSimple, &__uuidof(Word::ApplicationEvents)>
4

1 に答える 1

2

このコード スニペットを使用してイベントをディスパッチする際に最も消費される部分は、 を使用した配信でIDispatch::Invokeあり、完全に COM サーバー側にあります (特に、COM サーバーが別のプロセスまたはアパートメントに存在する場合)。この COM サーバーが提供する別のイベント ディスパッチ メソッドを認識していない限り、できることはほとんどありません。また、レイテンシの点でも優れています。

また、違いがある場合は説明してください... IDispEventSimpleImpl

違いはありません。IDispEventSimpleImplどちらの場合もあり、呼び出しを受け取るのはクラスです。IDispEventSimpleImpl(他の多くの ATL クラスとは異なり) 実際の COM オブジェクト クラスに実装する必要はありません。どのクラスでも実装できます。

于 2013-07-11T19:39:52.967 に答える