COM事件处理的最快方式(性能方面)

时间:2013-07-11 19:32:17

标签: c++ visual-studio-2010 com event-handling atl

我有带有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)>

1 个答案:

答案 0 :(得分:2)

使用此代码段调度事件最耗费的部分是使用IDispatch::Invoke的传递,它完全在COM服务器端(特别是如果COM服务器驻留在不同的进程或公寓中)。除非您了解此COM服务器提供的不同事件调度方法,否则您几乎无能为力,并且在延迟方面效果更好。

  

另外请解释一下... IDispEventSimpleImpl

之间是否存在差异

没有区别。在这两种情况下都是IDispEventSimpleImpl,它是接收呼叫的类。 IDispEventSimpleImpl(与许多其他ATL类不同)不需要你在真正的COM对象类上实现它,任何类都可以。