+ -
当前位置:首页 → 问答吧 → 如何连接到被包容的COM组件的连接点

如何连接到被包容的COM组件的连接点

时间:2011-12-07

来源:互联网

我实现了一个进程内COM组件(ATL),双接口(dual)。

该组件包容了一个进程外COM组件,并需要连接到该组件的默认连接点,该如何实现呢?

作者: hailongxl   发布时间: 2011-12-07

你看看包容的实现,得到被包容组件的接口,然后利用这个接口来得到连接点容器IConnectionPointContainer,然后再得到连接点

作者: fishion   发布时间: 2011-12-07

这个机制我知道,我的进程内组件的IDL是这样的:
C/C++ code
interface ICallerDev : IDispatch
    {
        [id(1), helpstring("method Beep")] HRESULT Beep([in]BSTR devId,[in]int times);
        [id(2), helpstring("method Display")] HRESULT Display([in]BSTR devId,[in]BSTR info,[in]BSTR formId);
        [id(3), helpstring("method SPConnect")] HRESULT SPConnect();
        [id(4), helpstring("method SPDisconnect")] HRESULT SPDisconnect();
    };


该接口从IDispatch接口派生,所以该组件已经实现了一个IDispatch接口(使用ATL的IDispatchImpl实现)。
如果需要连接到进程外组件的出接口,又需要一个不同的IDispatch接口来进行Advise,这个该如何处理?难道必须在该进程内组件内添加一个sink对象?有没有更简单的方法呢?

作者: hailongxl   发布时间: 2011-12-07

顶起。
除了内嵌一个SINK来advise之外有没有其他好方法?更轻便的?

谢谢了!

作者: hailongxl   发布时间: 2011-12-07

既然你都明白包容的机制了,那操作也不难了呀

作者: fishion   发布时间: 2011-12-07

如果是组件要接收事件,那sink显然应该在组件里。如果是客户要接收,可以直接让客户获得内部对象的接口,反正包容并不暗示是同一个对象。
不过为什么不能用同一个IDispatch呢...DISPID不一样的

作者: ndy_w   发布时间: 2011-12-07