有关QueryInterface函数

有关QueryInterface函数一,QueryInterface函数原型:HRESULT __stdcall QueryInterface(const IID&iid,void**ppv);iid:标志客户所需的接口。是”一个接口标志符“结构(IID)。ppv:QueryInterface用来存放所请求接口的地址。返回值:可以返回S_OK或E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证

大家好,又见面了,我是你们的朋友全栈君。

一,QueryInterface函数
原型:

HRESULT  __stdcall QueryInterface(const IID&iid,void **ppv);

iid:标志客户所需的接口。是”一个接口标志符“结构(IID)。
ppv:QueryInterface用来存放所请求接口的地址。

返回值:可以返回S_OK 或 E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证是否成功。

使用方法:

假如知道一个指向IUnknown接口的指针pI,传给它一个接口标志符即可

例如:

有关QueryInterface函数
void
 Foo(IUnknown 
*
 pI)
有关QueryInterface函数有关QueryInterface函数


{

有关QueryInterface函数    IX 
* pIX = NULL;
有关QueryInterface函数
有关QueryInterface函数    HRESULT hr 
= pI->QueryInterface(IID_IX,(void **)pIX);
有关QueryInterface函数
有关QueryInterface函数    
if(SUCCEEDED(hr))
有关QueryInterface函数有关QueryInterface函数    
{

有关QueryInterface函数      pIX
->FX();
有关QueryInterface函数     }

有关QueryInterface函数}


有关QueryInterface函数
有关QueryInterface函数

//
QueryInterface的实现。

有关QueryInterface函数


有关QueryInterface函数HRESULT _stdcall  CA::QueryInterface(

const
    IID
&
iid,
void
 
**
ppv)
有关QueryInterface函数有关QueryInterface函数


{

有关QueryInterface函数    
if(iid == IID_IUnknown)
有关QueryInterface函数有关QueryInterface函数    
{

有关QueryInterface函数      
*ppv = static_cast<IX *>(this);
有关QueryInterface函数    }

有关QueryInterface函数    
else  if(iid == IID_IX)
有关QueryInterface函数有关QueryInterface函数    
{

有关QueryInterface函数      
*ppv = static_cast<IX *>(this);
有关QueryInterface函数    }

有关QueryInterface函数    
else  if(iid == IID_IY)
有关QueryInterface函数有关QueryInterface函数    
{

有关QueryInterface函数      
*ppv = static_cast<IY *>(this);
有关QueryInterface函数    }

有关QueryInterface函数    
else  if(iid == IID_IUnknown)
有关QueryInterface函数有关QueryInterface函数    
{

有关QueryInterface函数      
*ppv = NULL;
有关QueryInterface函数      
return E_NOINTERFACE;
有关QueryInterface函数    }

有关QueryInterface函数
有关QueryInterface函数    static_cast 
<IUnknown *> (* ppv)->AddRef();
有关QueryInterface函数    retru S_OK;
有关QueryInterface函数
有关QueryInterface函数}

多重继承及类型转换。

通常将一种类型的指针转换为另一种类型并不会改变它的值。为了支持多重继承,某些情况下,C++必须改变类指针的值。
假如一个类定义如下:

class CA: public IX,public IY{…};

由于CA同时继承了IX,IY因此可以使用IX或IY指针的地方均可以使用指向CA的指针。

 

有关QueryInterface函数
void
 foo(IX
*
 pIX);
有关QueryInterface函数

void
 bar(IY
*
 pIY);
有关QueryInterface函数

int
 main()
有关QueryInterface函数有关QueryInterface函数


{

有关QueryInterface函数 CA
* pA = new CA;
有关QueryInterface函数 foo(pA);
有关QueryInterface函数 bar(pA);
有关QueryInterface函数 delete pA;
有关QueryInterface函数 
return 0;
有关QueryInterface函数}


有关QueryInterface函数
有关QueryInterface函数

foo需要一个指向合法的IX的虚拟函数表的指针;
bar需要一个指向合法的IY的虚拟函数表的指针;
当然IX和IY的虚拟函数表的内容是不一样的。因此将一个IX vtbl传给bar时,此函数是不能正常工作的。
因此编译器将同一指针传给foo和bar是不可能的,它必须对CA的指针进行修改以便他指向一个合适的vtbl指针。
下图显示了CA对象的内存结构。

2.jpg

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151157.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ACE_Message_Queue和spawn实现(生产者/消费者)(V2.00)

    ACE_Message_Queue和spawn实现(生产者/消费者)(V2.00)

    2022年2月7日
  • MySQL——MySQL 图形化管理工具的介绍

    MySQL——MySQL 图形化管理工具的介绍文章目录MySQL——MySQL图形化管理工具的介绍1、MySQLWorkbench2、Navicat3、SQLyog4、DBeaver5、DataGripMySQL——MySQL图形化管理工具的介绍MySQL图形化管理工具极大地方便了数据库的操作与管理,常用的图形化管理工具有:MysQLWorkbench、phpMyAdmin、NavicatPreminum、MySQLDumper、SQLyog、dbeaver、MysQLODBcConnector、DataGrip。1、MySQL

    2022年6月30日
  • random函数的用法

    random函数的用法用法:1、random.random()随机生成(0,1)之间的浮点数2、random.randint(上限,下限)随机生成在范围之内的整数,两个参数分别表示上限和下限3、random.randrange(,,)在指定范围内,按指定基数递增的集合中获得一个随机数,有三个参数,前两个参数代表范围上限和下限,第三个参数是递增增量,不包括下限,包括上限使用方式如下:random.r…

    2022年6月12日
  • 两个正序数组 找中位数_有一组已安排好序的数组

    两个正序数组 找中位数_有一组已安排好序的数组原题连接给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5示例 3:输入:nums1 = [0,

    2022年8月9日
  • python2+selenium爬取笔趣读小说

    python2+selenium爬取笔趣读小说python2+selenium爬取笔趣读小说 #!/usr/bin/envpython#coding=utf-8fromseleniumimportwebdriverimporttimefrombs4importBeaut…

    2022年10月22日
  • 奋斗米莱经典台词[通俗易懂]

    奋斗米莱经典台词[通俗易懂]米莱,她专一,不做作,善良,敢爱敢恨。1.记住,在这个世界上,男人女人各有分工,男人主要用来对女人使坏,女人主要用来对男人好,以前我对这种混蛋分工特不满意。可是现在,我认命了。2.对夏琳:其

    2022年7月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号