首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AtlComPtrAssign有什么用呢?

AtlComPtrAssign有什么用呢?
EN

Stack Overflow用户
提问于 2012-02-21 18:02:08
回答 1查看 2.2K关注 0票数 2

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

代码语言:javascript
运行
复制
IUnknown* AtlComPtrAssign( IUnknown** pp, IUnknown* lp);

必须这样调用:

代码语言:javascript
运行
复制
T* operator=( const CComPtr<T>& lp) throw()
{
    if(*this!=lp) {
        return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
    }
    return *this;
}

如果我尝试用T作为实现多个COM接口的类来存储use CComPtr,这会导致问题-到IUnknown*的转换变得不明确,并且编译失败。

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

代码语言:javascript
运行
复制
template<classT>
T* AtlComPtrAssign( T** pp, T* lp);

并将其称为任何合理的T?这个向上转换到IUnknown*,然后反向向下转换到T*的需要是什么

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-21 18:13:36

CComPtr<>的

  1. 模板参数是一个接口,而不是一个完整的类,因此不能有多个IUnknown,始终只有一个。
  2. 我假设AtlComPtrAssign的整个历史是在早期,函数可选地驻留在ATL.DLL中,除非选择某些选项,否则人们更喜欢静态链接而不是ATL。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9375526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档