有关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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • OLAP组件选型[通俗易懂]

    OLAP组件选型[通俗易懂]OLAP组件选型一、OLAP简介1、olap准则2、OLAP场景的关键特征3、与oltp比较二、开源引擎1、Hive2、sparkSQL3、presto4、kylin5、impala6、druid7、Greeplum8、clickhouse三、选型要求1、实时性要求较高,对接kafka,实时查询数据2、可以接入hive数据3、单表查询数据较多,较少的join,在数仓中完成宽表构建一、OLAP简介说起OLAP要追溯到1993年。1、olap准则准则1OLAP模型必须提供多维概念视图准则

    2025年6月8日
    2
  • 虚拟机usb设备连接不成功_ssh怎么连接虚拟机

    虚拟机usb设备连接不成功_ssh怎么连接虚拟机解决【使用shell连接虚拟机时连接等待时长过长】的问题打开sshd服务的配置文件/etc/ssh/sshd_config把UseDNSyes,改为UseDNSno重启ssh服务打开sshd服务的配置文件/etc/ssh/sshd_config以管理员身份输入下面的命令:vi/etc/ssh/sshd_config把UseDNSyes,改为UseDNSno1、按下键盘的I键,进入编辑模式2、找到UseDNSyes,把注释#去掉,把yes修改为no3、按下键盘的Esc键,并

    2022年9月22日
    2
  • vue 表单验证内容隐藏_vue中input获取焦点

    vue 表单验证内容隐藏_vue中input获取焦点如果你用vue或者element的ui去验证发现很麻烦。如果你只想简单验证:其实html自带了验证:这里required就是必填,pattern就是正则规作者:古红平链接:https://www.zhihu.com/question/37099220/answer/81969475来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。去搜索一下属性就知道了。https://www.w3schools.com/…

    2025年5月23日
    4
  • 对BeforeSuite和BeforeTest的理解

    对BeforeSuite和BeforeTest的理解

    2021年9月14日
    78
  • 5种方式实现 Java 单例模式

    5种方式实现 Java 单例模式单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。是否多线程安全:是是否懒加载:否正如名字含义,饿汉需要直接创建实例。缺点:类加载就初始化,浪费内存优点:没有加锁,执行效率高。还是线程安全的实例。懒汉单例,在类初始化不会创建实例,只有被调用时

    2022年8月11日
    11
  • tp3.2分页样式

    tp3.2分页样式首先要搞清楚的就是ThinkPHP3.2.3的分页类已经被移到了Think\Page.class.php,这是跟以前的版本有些不一样的,使用起来还是跟以前版本差不多,但是默认的效果不敢恭维,所以最好是自己加些样式。我加了一些样式(不怎么好看),大家可以自行的再去改进分页样式,效果图:在这里我有先把page的设置做成了一个函数getpage,将这个方法放到Application\Commo…

    2022年7月17日
    21

发表回复

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

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