do_QueryInterface分析

4 篇文章 0 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值