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就是一个接口。

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

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

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


相关推荐

  • AbstractQueuedSynchronizer_setcursel函数用法

    AbstractQueuedSynchronizer_setcursel函数用法executeScalar 用于查询    返回影响的行的第一行第一列ExecuteNonQuery 用于增、删、改? 返回受影响的行数

    2025年9月6日
    8
  • SQL聚合函数功能和用法解析

    SQL聚合函数功能和用法解析第一部分:介绍SUM和AVG  我们知道数据库通常包含大量数据,要从海量的数据中找到我们需要的某条记录无异于大海捞针,不过通过SQL语言我们可以找到很多方法从数据库中提取我们要查找的特定数据,就是通过这些方法我们才能找到“列举出七八两个月中购买了西伯利亚羊毛的所有顾客的姓名”这类问题的答案。  很多时候,我们还希望能够通过对数据进行分析,总结出规律和趋势或生成高水平的报表。例如,对于采购经理来说,…

    2022年6月21日
    30
  • java初级求职简历,初级Java软件工程师求职简历范文[通俗易懂]

    求职目标:Java软件工程师姓名:张XX年龄:24岁住址:北京市朝阳区电话:135xxxxxxxx邮箱:lucky@ijianli.com教育背景2013.09-至今??XXXXX大学??通信工程(本科)主修课程:电路理论基础、电子线路(线性与非线性)、电磁场理论、数字图像处理、数字系统与逻辑设计、单片机原理及其接口技术、信号与线性系统、数字信号处理、微机原理与测控技术、计算机网络与数据…

    2022年4月10日
    54
  • PyTorch碎片:PyToch和Torchvision对应版本「建议收藏」

    PyTorch碎片:PyToch和Torchvision对应版本「建议收藏」前言错误分析:安装pytorch或torchvision时,无法找到对应版本cuda可以找到,但是无法转为.cuda()以上两种或类似错误,一般由两个原因可供分析:cuda版本不合适,重新安装cuda和cudnnpytorch和torchvision版本没对应上pytorch和torchvision版本对应关系pytorchtorchvisionpythoncuda1.5.10.6.1>=3.69.2,10.1,10.21.5.0

    2022年6月24日
    57
  • 目标检测使用LabelImg标注VOC数据格式和YOLO数据格式——LabelImg使用详细教程

    目标检测使用LabelImg标注VOC数据格式和YOLO数据格式——LabelImg使用详细教程欢迎大家关注笔者,你的关注是我持续更博的最大动力原创文章,转载告知,盗版必究@[toc](目标检测使用LabelImg标注VOC数据格式和YOLO数据格式——LabelImg使用详细教程文章目录:)1LabelImg介绍与安装1.1Label介绍github是目标检测数据标注工具,可以标注标注两种格式:VOC标签格式,标注的标签存储在xml文件YOLO标签格式,标注的标签存储在txt文件中LabelImg的github主页地址:点我,带你去>https://…

    2022年6月16日
    57
  • 安卓适配AutoSize详解

    安卓适配AutoSize详解GItHub的官方地址:https://gitee.com/lcb1992/AndroidAutoSize一.项目导入implementation’me.jessyan:autosize:1.2.1’1.1manifest里面进行设置<manifest><application><meta-dataandroid:name=”design_width_in_dp”

    2022年6月6日
    29

发表回复

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

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