关于在atl 控件中建立一个 IDISPATCH 回调对象的 讨论

hbs_biscuit 2014-05-05 09:31:58
有一个第三方的控件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 中实现类似的这种结构呢。
...全文
155 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2014-05-05
  • 打赏
  • 举报
回复
引用 2 楼 hbs_biscuit 的回复:
删除了以后 我怎么 创建各个对象呢 CoGetClassObject 就找不到 这个对象了 ,这个对象 也 new 不了
改成别的接口
hbs_biscuit 2014-05-05
  • 打赏
  • 举报
回复
删除了以后 我怎么 创建各个对象呢 CoGetClassObject 就找不到 这个对象了 ,这个对象 也 new 不了
redui 2014-05-05
  • 打赏
  • 举报
回复
在IDL中删除此接口的内容
hbs_biscuit 2014-05-05
  • 打赏
  • 举报
回复
删掉后就不能使用cogetclassobject了,改成别的接口是什么意思呢

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧