有关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)
上一篇 2022年6月22日 下午2:16
下一篇 2022年6月22日 下午2:16


相关推荐

  • NB-IoT:指定频点操作「建议收藏」

    NB-IoT:指定频点操作「建议收藏」NBIOT指定频点后需要关闭射频开关,然后再清频点再开射频开关,最后附着网络。实际使用中最好不要锁定频点,否则很容易造成连接不上。AT+NEARFCN=0,2508,123——这里取值均为例子AT+CFUN=0AT+NCSEARFCNAT+CFUN=1AT+CGATT=1先设置频点,然后再清除频点,然后在CGATT…

    2022年10月6日
    5
  • php 递归[通俗易懂]

    php 递归[通俗易懂]php 递归

    2022年4月20日
    33
  • 计算机bit是什么意思

    计算机bit是什么意思bit 是计算机中数据的最小单位 即二进制位 数字 0 和 1 一个字节是八位 8 个 0 和 1 或 1 组成的一串二进制 一个字是 16 位 等于 2 个字节用八位二进制表示的字符叫单字节字符 用 16 位二进制数表示的字符叫双字节字符转载于 https www cnblogs com baxianhua p 9927587 html

    2026年3月18日
    2
  • 【Linux】进程间通信「建议收藏」

    【Linux】进程间通信「建议收藏」目录1.进程间通信1.1.进程间通信的目的1.2.如何实现进程间通信2.管道通信2.1.匿名管道2.1.1创建匿名管道2.1.2.深入理解匿名管道2.2.命名管道2.2.1.创建命名管道3.systemV标准进程间通信3.1.共享内存3.1.1.实现原理3.1.2.代码实现3.2.消息队列(了解)3.2.1实现原理3.3.信号量(了解)3.3.1.实现原理1.进程间通信1.1.

    2022年10月11日
    5
  • C语言冒泡排序升序_c语言快速排序和冒泡排序

    C语言冒泡排序升序_c语言快速排序和冒泡排序任务代码:执行情况:知识总结:冒泡排序法:也叫升序排序法,但是相比起二分法查找只能应用于有序数列,二如何将一个无序数列变的有序就可以使用冒泡排序法!!!对上面的过程进行总结:该思想体现在成续上的解法是:实例:冒泡排序不仅仅可以应用于数字同样可以应用于字符字母的快速排序:心得体会:

    2025年6月15日
    4
  • idea2021.7.16激活码(JetBrains全家桶)「建议收藏」

    (idea2021.7.16激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月21日
    56

发表回复

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

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