queryinterface的用法[通俗易懂]

queryinterface的用法[通俗易懂]客户可以根据QueryInterface函数来查询某个组件是否支持某个特定的接口,若支持,则QueryInterface则返回一个指向特定接口的指针,若不支持,则返回一个错误代码,它的函数形是这样的:     HRESULT__stdcallQueryInterface(constIID&iid,void**ppv);昨天已经设计了一个极其简单的QueryInte

大家好,又见面了,我是你们的朋友全栈君。 客户可以根据QueryInterface函数来查询某个组件是否支持某个特定的接口,若支持,则QueryInterface则返回一个指向特定接口的指针,若不支持,则返回一个错误代码,它的函数形是这样的:

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

昨天已经设计了一个极其简单的QueryInterface函数,如下:

queryinterface的用法[通俗易懂]
HRESULT CA::QueryInterface(
const
IID
&
iid,
void
**
ppv)
queryinterface的用法[通俗易懂]queryinterface的用法[通俗易懂]

queryinterface的用法[通俗易懂]
{
queryinterface的用法[通俗易懂]    

if
(iid
==
IID_IUnknown)
queryinterface的用法[通俗易懂]queryinterface的用法[通俗易懂]    

queryinterface的用法[通俗易懂]
{
queryinterface的用法[通俗易懂]        

*
ppv
=
static_cast
<
IX
*>
(
this
);
queryinterface的用法[通俗易懂]     }


queryinterface的用法[通俗易懂]    

else

if
(iid
==
IID_IX)
queryinterface的用法[通俗易懂]queryinterface的用法[通俗易懂]    

queryinterface的用法[通俗易懂]
{
queryinterface的用法[通俗易懂]        

*
ppv
=
static_cast
<
IX
*>
(
this
);
queryinterface的用法[通俗易懂]     }

         
queryinterface的用法[通俗易懂]    

else

if
(iid
==
IID_IY)
queryinterface的用法[通俗易懂]queryinterface的用法[通俗易懂]    

queryinterface的用法[通俗易懂]
{
queryinterface的用法[通俗易懂]        

*
ppv
=
static_cast
<
IY
*>
(
this
);
queryinterface的用法[通俗易懂]     }

     
queryinterface的用法[通俗易懂]    

else

queryinterface的用法[通俗易懂]queryinterface的用法[通俗易懂]    

queryinterface的用法[通俗易懂]
{
queryinterface的用法[通俗易懂]        

*
ppv
=
NULL;
queryinterface的用法[通俗易懂]        

return
E_NOINTERFACE;
queryinterface的用法[通俗易懂]     }

     
queryinterface的用法[通俗易懂]     static_cast

<
IUnknown
*>
(
*
ppv)
->
AddRef();
queryinterface的用法[通俗易懂]    

return
S_OK;
queryinterface的用法[通俗易懂]}

设计QueryInterface具有一些规则,虽然看来看去还是不太理解,但还是抄录如下:

1.QueryInterface返回的总是同一个IUnknown的指针。

2.若客户曾经获取过某个接口,那么它总能获取此接口。

3.客户可以再次获取已经拥有的接口。

4.客户可以返回到起始接口。

5.若能从某个接口获取某个特定接口,那么可以从任意接口获取此接口。

———————————————————————————————————————————————————–

一些附加的知识点:

以前一直以为接口是抽象类中的方法或函数,其实是错的,按现在的理解来说,接口就是某个抽象类,而组件就是派生此接口并实现其方法的类。找到该接口就是看看该组件(简单点说就是派生类)中有没有为其抽象的父类提供实现方法。就像上一例,CA派生自抽象类IX,IY,IZ。可以说,IX,IY,IZ就是CA组件的接口,但是,CA类中只为IX,IY重载(override)了它们的方法Fx(),Fy(),并没有对IZ抽象类重载其方法Fz(),所以,通过QueryInterface,可以找到组件CA中有接口IX,IY,而找不到接口IZ。

在COM中,一个接口一旦确立并被客户使用后,这个接口就不会发生任何变化,至于为什么,搞不明白,可能是改变了之后,COM的二进制代码发生改变,而使客户调用不到正确的方法了吧!每一个接口都有一个全局标识符IID,一般情况下,我们不会去改变老的接口,如果有需要,可以为组件增加一个新的接口,并再分配之一个相应的IID号,当QueryInterface接收到对老IID的查询时,它返回的是老的接口,而接受到一个新IID的查询时,返回的就是新的接口,对于QueryInterface函数来说,一个IID就是一个接口。

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148851.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java简单酒店管理系统_javaweb酒店管理系统

    java简单酒店管理系统_javaweb酒店管理系统编写Java程序实现小型酒店管理系统。为某个酒店编写程序:酒店管理系统,模拟订房、退房、打印所有房间状态等功能。1、该系统的用户是:酒店前台。2、酒店使用一个二维数组来模拟。“Room[][]rooms;”3、酒店中的每一个房间应该是一个java对象:Room4、每一个房间Room应该有:房间编号、房间类型、房间是否空闲.5、系统应该对外提供的功能:可以预定房间:用户输入房间编号,订房。可以退房:用户输入房间编号,退房。可以查看所有房间的状态:用户输入某个指令应该可以查看所有房间状态。

  • informix错误代码_大师剑bug

    informix错误代码_大师剑bugRecommendedFixesforInformixServerProductsProductdocumentationAbstractAcomprehensivelistofrecommendedfixesforInformixServerproductreleases.ContentLastModified:March22,2012R

    2022年10月21日
  • 软件的静态测试_软件测试静态测试和动态测试的区别

    软件的静态测试_软件测试静态测试和动态测试的区别静态测试通常是指不执行程序代码而寻找代码中可能存在的错误或评估程序代码的过程。静态测试的主要内容:①各阶段的评审、②代码检查、③软件复杂性分析、④软件质量度量①评审是对软件元素或项目状态进行评估的活动,用以确定与预期结果之间的偏差和相应的改进意见,一般评审包括培训评审、预备评审、同行评审。同行评审是由开发软件产品作者以外的其他人检查工作产品,以发现缺陷并寻找改进的机会同行评审一般包

    2022年10月29日
  • origin如何在柱状图上面显示数据_origin柱状图横坐标自定义

    origin如何在柱状图上面显示数据_origin柱状图横坐标自定义经验:Origin做柱状图常遇问题/柱状图X坐标轴如何设置—小技巧对于每个搞科研的人来说,origin这个作图软件是必不可少的!但是,对于新手来说(我也算是半个新手*^__^*),它有时候显得有点高深,不知道该如何设置。就拿这次来说吧,同门要画一个性能随含量变化的柱状图(希望大体效果希望如上图,上图还没完全设置好),但是不知道该如何设置X坐标轴,因为含量的变化区间不是固定的,例如10%,20%,4…

  • IIC通信协议详解

    IIC通信协议详解IIC通信协议详解IIC的概述IIC分为软件IIC和硬件IICIIC通信协议空闲状态开始信号与停止信号开始信号程序:IIC的概述IIC:两线式串行总线,它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbs以上。时钟线SCL:在通信过程起到控制作用。数据线SDA:用来一位一位的传送数据。IIC分为软件IIC和硬件IIC软件IIC:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用

  • 简单介绍一下spring bean的生命周期_生命周期分析

    简单介绍一下spring bean的生命周期_生命周期分析面试题来自面试官发自灵魂深处的拷问:谈谈你对spring的理解;一脸懵逼的求职者的内心活动:啥?具体的问题是什么?现在的面试都不按套路出牌了吗?抛出一个这么大的问题,你让我怎么回答?一脸懵逼的求职者的回答:额~~~这个。。。。额~~~那个。。。。额~~~不知道唉。。。为什么面试官要问这种问题?不可否认,现在的大多数的面试出题方式都是这样的,惊人的相似,就是面试官喜欢抛出一个问题,看你能讲多深,考的就是你对这项技术的深度和广度,深度就是你对技…

发表回复

您的电子邮箱地址不会被公开。

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