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: