关于在atl 控件中建立一个 IDISPATCH 回调对象的 讨论
有一个第三方的控件B 公开了一个 基于 IDISPATCHEX 的接口,没有任何接口函数,由于脚本语言都是后绑定的 ,所以它可以在网页中正常的使用。
我现在需要将这个控件B嵌入我自己写的ATL 控件 A 中
我猜想这个控件的方法 都是通过 IDISPATCHEX 的接口查询找到的 ,所以我在 A 中创建控件B ,并通过pDispatchEx->GetMemberName , 然后 invoke 调用均是成功的 。
通过分析 B 中有个方法 method01,应该是 传入了一个 IDispatch 对象,供 控件 B 后续调用,所以我需要在 A 中实现这样一个对象。
我设想是通过 在 控件 A 中 新建一个 atl 简单对象,继承与 IDispatchimpl 模板类,可以公开idispatch 接口。这样 我调用 method01时就直接传入这个对象指针就好了。
为了模拟这个过程 我自己编写了 控件 BB 对应于 B ,控件 AA 对应于 A 。 整个调用过程是成功的 。
我的问题是: 如果按上面的步骤操作,那么在 A中 新建了一个 类对象,在 IDL 中 有相关的 coclass 和接口说明,这样 当A 被别人使用时 ,这个 对外部没用的 继承于 IDISPATCH 的接口 就暴露了。我应该在 A 中如何建立一个 对象 既可以被 B 回调,而又不需要在 IDL 或者类型库中暴露这个对象呢。
联想到 MFC 的 ccmdtarget 包装了一个 连接点实现 ,他就可以既提供 接口 又不在类型库中暴露 ,我应该如何在 atl 中实现类似的这种结构呢。