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 回答