【问题标题】:What's the need for AtlComPtrAssign?AtlComPtrAssign 需要什么?
【发布时间】:2012-03-11 15:26:30
【问题描述】:

目前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;
}

如果我尝试使用 T 作为实现多个 COM 接口的类来存储使用 CComPtr 会导致问题 - 到 IUnknown* 的转换变得模棱两可并且编译失败。

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

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

并以任何合理的T 调用它?这个向上转换到IUnknown*然后反向转换到T*有什么需要?

【问题讨论】:

  • 为什么operator=返回T*而不是CComPtr&lt;T&gt;&amp;

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


【解决方案1】:
  1. CComPtr 的模板参数是一个接口,而不是一个完整的类,因此你不能有多个IUnknowns,总是只有一个。
  2. 我想AtlComPtrAssign 的全部历史是,在早期,该函数可以选择驻留在 ATL.DLL 中,除非选择某些选项更喜欢静态链接到 ATL。

我相信对于早期版本的 ATL,您也可以将 CComPtr 与类一起使用。我记得使用过它,它非常方便——你可以同时拥有自动引用计数和原始类指针(与接口指针相反),但在某些时候,由于编译器错误,这种使用不再可用,并且需要一个自定义模板类而不是标准的 CComPtr 来实现相同的功能。

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 1970-01-01
    • 2015-01-26
    • 2020-12-14
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多