目前使用具有以下签名的帮助函数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*
的需要是什么?
答案 0 :(得分:1)
IUnknown
,总有一个。 AtlComPtrAssign
的整个历史是在早期,该函数可选地驻留在ATL.DLL中,除非选择某些选项,而不希望静态链接到ATL。我相信对于早期版本的ATL,您也可以将CComPtr
与类一起使用。我记得使用它并且非常方便 - 你可以同时拥有自动引用计数和原始类指针(而不是接口指针),但是在某些时候由于编译器错误而无法再使用此类用户,而且需要一个自定义模板class而不是标准CComPtr来实现相同的功能。