gpt4 book ai didi

c++ - AtlComPtrAssign 需要什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:12 27 4
gpt4 key购买 nike

当前 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 接口(interface)的类 - 转换为 IUnknown*变得模棱两可,编译失败。

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

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

并以任何合理的方式调用它 T ?这个升级到 IUnknown* 的需要是什么?然后反向向下转换为 T*

最佳答案

  1. CComPtr<> 的模板参数是一个接口(interface),而不是一个完整的类,因此你不能在那里有多个 IUnknown,总是只有一个。
  2. 我想 AtlComPtrAssign 的整个历史是,在早期,该函数可选择驻留在 ATL.DLL 中,除非选择某些选项,人们更喜欢静态链接到 ATL。

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

关于c++ - AtlComPtrAssign 需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9375526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com