通过IDispEventImpl可以实现基于IDispatch连接点Sink。
不过我想使用IDispatchImpl来做方便一些。
但是使用中发现IDispatchImpl无法接受到阿,而IDispEventImpl就可以,不知道为何,请指教。
另外要说明的是,我要实现的ISomeSink接口是来自另外一个应用程序的,比如Word。

解决方案 »

  1.   

    通过IDispEventImpl可以实现基于IDispatch连接点Sink。
    不过我想使用IDispatchImpl来做方便一些。    
    这样说是错误的,如果要用IDispatchImpl来做你必须手动把IDispEventImpl中的那几个方法重新包装一遍,除非你特别精通com要不然劝你放弃!
      

  2.   

    ATL的模板类IDispatchImpl只支持双接口,不支持dispinterface,源对象的出接口(outgoing interface)往往是dispinterface,所以接收器对象要通过其他的途径来实现事件接口。ATL提供了两个模板类IDispEventImpl和IDispEventSimpleImpl用于接收器对象的实现,IDispEventImpl要借助于类型库所提供的出接口类型信息,这是最简单的实现方法,而IDispEventSimpleImpl不需要类型库的支持,这是效率最高的方法。这两种方法都需要用到事件接收器映射表(event sink map)
    看ATL技术内幕
      

  3.   

    谢谢。
    我想再请问一下,IDispatchImpl和IDispEventImpl具体的区别在哪里?如果要用IDispatchImpl实现Sink,我应该具体怎么做呢?
      

  4.   

    事件接收器是一个类,从IDispEventImpl继承。IDispEventImpl是ATL中的一个模板,专用于接收IDispatch接口的事件。IDispatchImpl不支持事件.你还是直接从IDispEventImpl派生把
      

  5.   

    我觉得比较奇怪的是,不管是Sink还是IDispatch,他们本质都应该是可以通过IDispatch接口来Invoke各个函数,有没有SinkMap应该区别不大阿。MSDN上说:IDispatchImpl可以用来实现Sink,只是每个函数都需要实现,而IDispEventImpl则不需实现每个函数。这是为什么?按照MSDN上的说法,应该IDispatchImpl是可以的才对阿?望指教一二。多谢。