do_QueryInterface

移动开发 专栏收录该内容
90 篇文章 1 订阅

do_QueryInterface( nsISupports* aRawPtr )分析

操作语法:nsCOMPtr<nsIDirectoryServiceProvider> prov = do_QueryInterface(aElement);
它等价于:aElement->QueryInterface(iid, &prov)


具体流程如下:

1. 首先构造一个nsQueryInterface对象,它封装了一个nsISupports接口指针。它是一个函数子,被构造nsCOMPtr对象时所回调,用来查询指定接口。
nsQueryInterface do_QueryInterface( nsISupports* aRawPtr )
{
    return nsQueryInterface(aRawPtr);
}

2. 接下来,构造赋值nsCOMPtr对象
nsCOMPtr( const nsQueryInterface qi )
      : NSCAP_CTOR_BASE(0)
    // construct from |do_QueryInterface(expr)|
{
  NSCAP_LOG_ASSIGNMENT(this, 0);
  assign_from_qi(qi, NS_GET_IID(T));
}

3. 接下来,开始查询接口,便于给nsCOMPtr对象赋值
template <class T>
void nsCOMPtr<T>::assign_from_qi( const nsQueryInterface qi, const nsIID& aIID )
{
 T* newRawPtr;
 if ( NS_FAILED( qi(aIID, NS_REINTERPRET_CAST(void**, &newRawPtr)) ) )
  newRawPtr = 0;
 assign_assuming_AddRef(newRawPtr);
}
    
4. 调用函数子,开始查询接口
nsresult nsQueryInterface::operator()( const nsIID& aIID, void** answer ) const
{
 nsresult status;
 if ( mRawPtr )
 {
  status = mRawPtr->QueryInterface(aIID, answer);
 }
 else
  status = NS_ERROR_NULL_POINTER;
 
 return status;
}

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值