AtlComPtrAssign有什么需要?

时间:2012-02-21 10:02:08

标签: c++ com atl multiple-inheritance smart-pointers

目前使用具有以下签名的帮助函数CComPtr::operator=实现AtlComPtrAssign()

IUnknown* AtlComPtrAssign( IUnknown** pp, IUnknown* lp);

并且必须像这样调用:

T* operator=( const CComPtr<T>& lp) throw()
{
    if(*this!=lp) {
        return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
    }
    return *this;
}

如果我尝试存储使用CComPtr并且T是一个实现多个COM接口的类,则会导致问题 - 转换为IUnknown*变得模糊不清并且编译失败。

我的问题是 - 使用具有这些参数的辅助函数需要什么?为什么不这样做:

template<classT>
T* AtlComPtrAssign( T** pp, T* lp);

并为任何合理的T调用它?对IUnknown*进行向上转换然后向下转换为T*的需要是什么?

1 个答案:

答案 0 :(得分:1)

  1. CComPtr的模板参数&lt;&gt;是一个接口,而不是一个完整的类,因此你不能有多个IUnknown,总有一个。
  2. 我认为AtlComPtrAssign的整个历史是在早期,该函数可选地驻留在ATL.DLL中,除非选择某些选项,而不希望静态链接到ATL。
  3. 我相信对于早期版本的ATL,您也可以将CComPtr与类一起使用。我记得使用它并且非常方便 - 你可以同时拥有自动引用计数和原始类指针(而不是接口指针),但是在某些时候由于编译器错误而无法再使用此类用户,而且需要一个自定义模板class而不是标准CComPtr来实现相同的功能。