描述:
通过IDispEventImpl可以实现基于IDispatch连接点Sink。
不过我想使用IDispatchImpl来做方便一些。
但是使用中发现IDispatchImpl无法接受到阿,而IDispEventImpl就可以,不知道为何,请指教。
另外要说明的是,我要实现的ISomeSink接口是来自另外一个应用程序的,比如Word。
解决方案1:
事件接收器是一个类,从IDispEventImpl继承。IDispEventImpl是ATL中的一个模板,专用于接收IDispatch接口的事件。IDispatchImpl不支持事件.你还是直接从IDispEventImpl派生把
解决方案2: ATL的模板类IDispatchImpl只支持双接口,不支持dispinterface,源对象的出接口(outgoing interface)往往是dispinterface,所以接收器对象要通过其他的途径来实现事件接口。ATL提供了两个模板类IDispEventImpl和IDispEventSimpleImpl用于接收器对象的实现,IDispEventImpl要借助于类型库所提供的出接口类型信息,这是最简单的实现方法,而IDispEventSimpleImpl不需要类型库的支持,这是效率最高的方法。这两种方法都需要用到事件接收器映射表(event sink map)
看ATL技术内幕
通过IDispEventImpl可以实现基于IDispatch连接点Sink。
不过我想使用IDispatchImpl来做方便一些。
这样说是错误的,如果要用IDispatchImpl来做你必须手动把IDispEventImpl中的那几个方法重新包装一遍,除非你特别精通com要不然劝你放弃!