--------向CSDNCOM高手提问-------什么是tearoff技术?---------------

Congy 2002-04-23 03:25:41
请回答
...全文
222 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Congy 2002-04-28
  • 打赏
  • 举报
回复
有什么用呢?
Areece 2002-04-23
  • 打赏
  • 举报
回复
tearoff的实质就是在你的组件需要实现的某个接口是由其他的组件实现的,但是与聚合及包容不同的是在没有客户程序要求这个接口的时候,对象是不会创建的,当QueryInterface要到了这个tearoff接口的时候,才生成那个组件的实例,tearoff又分为cache和非cache的,支持cache的tearoff组件只生成一次,以后再用的时候是经过缓冲的组件实例,而非cache组件则在每一次QeuryInterface都要生成一个新的实例来供客户使用。
我给一个简单的例子程序吧,
首先使用Atl com wizard 生成一个COM组件,增加一个ATL object CMainObj
然后在idl文件里面接增加一个要tearoff的接口ITearOff,注意这个tearoff接口不用加到coclass里面去
在CMainObj的头文件中加入下面的代码
class CMainObj;
class ATL_NO_VTABLE CTearOff:
public ITearOff,
public CComTearOffObjectBase<CMainObj>
{
public:

BEGIN_COM_MAP (CTearOff1)
COM_INTERFACE_ENTRY(ITearOff)
END_COM_MAP()
}
在CMainObj的COM_MAP中增加下面一个接口
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff,CTearOff,m_pUnkTearOff)
其中的m_nUnkTearOff是一个CMainObj里面的一个成员变量,声明如下
IUnknown *m_pUnkTearOff;
修改CMainObj的构造函数,增加下面的初始代代码
m_pUnkTearOff1 = NULL;
修改void FinalRelease ()
{
if(m_pUnkTearOff!= NULL)
m_pUnkTearOff->Release ();
}
哧哧,收工
ps.至于各个宏的意义可以找本ATL书看看,tearoff的关键在于CTearOff是实现ITearOff功能的对象,但是在CMainObj没有用到ITearOff的时候,是没有CTearOff对象的实例的。
不知道说清楚了没有

3,245

社区成员

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

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