QueryInterface 实现及使用的完整的例子

QueryInterface 实现及使用的完整的例子下面我们将把前面所提到过和各代码段组合起来,以构成一个说明QueryInterface实现及使用的完整例子。总的来说可以将这些代码分成三部分。第一部分是接口IX、IY和IZ的定义部分。接口IUnknown的定义在Win32SDK的头文件1见UNKNWN.H中。第二部分是组件的实现。类CA实现了一个支持IX和IY接口的组件。QueryInterface的实现

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

下面我们将把前面所提到过和各代码段组合起来,以构成一个说明QueryInterface 实现及使用的完整例子。
总的来说可以将这些代码分成三部分。
第一部分是接口IX、 IY 和 IZ 的定义部分。接口 IUnknown 的定义在 Win32 SDK 的头文件 1 见UNKNWN . H 中。
第二部分是组件的实现。类 CA 实现了一个支持 IX 和 IY 接口的组件。QueryInterface的实现同前一节中给出的实现是一样的。在类CA的末尾给出了CreateInstance 的定义。客户可以使用此函数来创建类 CA 所代表的组件并返回一个指向其 IUnknown 接口的指针。
在定义好 CreateInstance函数之后,下面定义的是各接口的 IID 结构。从这些定义可以看出 IID 结构是一个相当大的结构。

清单中的第三部分也就是最后一部分是main 函数,它表示示例程序中的客户。

 

#include 
<
iostream
>

#include 

<
objbase.h
>

#include 

<
windows.h
>


using
 
namespace
 std;


void
 trace(
const
 
char
 
*
msg){cout
<<
msg
<<
endl;}


//
interfaces


interface
 IX:IUnknown
{

    

virtual
 
void
 _stdcall Fx()
=
0
;
};


interface
 IY:IUnknown
{

    

virtual
 
void
 _stdcall Fy()
=
0
;
};


interface
 IZ:IUnknown
{

    

virtual
 
void
 _stdcall Fz()
=
0
;
};


//
forward references for guids


extern
 
const
 IID IID_IX;

extern
 
const
 IID IID_IY;

extern
 
const
 IID IID_IZ;


//
component




class
 CA:
public
 IX,
public
 IY
{

    

//
IUnknown implementation


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

virtual
 ULONG _stdcall AddRef(){

return
 
0
;}
    

virtual
 ULONG _stdcall Release(){

return
 
0
;}

    
//
interface IX implementation


    
virtual
 
void
 _stdcall Fx() {cout
<<

FX

<<
endl;MessageBox(NULL,

hello world

,

caption

,MB_OK);};
    

//
interface IY implementation


    
virtual
 
void
 _stdcall Fy(){cout
<<

FY

<<
endl;}

};

HRESULT _stdcall CA::QueryInterface(
const
 IID
&
 iid,
void
 
**
 ppv)
{

    

if
(iid
==
IID_IUnknown)
    {

        trace(


QueryInterface:return pointer to IUnknown

);
        

*
ppv
=
static_cast
<
IX 
*>
(
this
);
    }

    
else
 
if
(iid
==
IID_IX)
    {

        trace(


QueryInterface:Return pointer to IX.

);
        

*
ppv
=
static_cast
<
IX 
*>
(
this
);
    }

    
else
 
if
(iid
==
IID_IY)
    {

        trace(


QuertyInterface:Return pointer to IY

);
        

*
ppv
=
static_cast
<
IY 
*>
(
this
);
    }
    

else

    {

        trace(


QuertyInterface:Interface not supported

);
        

*
ppv
=
NULL;
        

return
 E_NOINTERFACE;
    }
    reinterpret_cast

<
IUnknown 
*>
(
*
ppv)
->
AddRef();
    

return
 S_OK;

}


//
creation function


IUnknown 
*
 CreateInstance()
{

    IUnknown 

*
 pI
=
static_cast
<
IX 
*>
(
new
 CA);
    pI

->
AddRef();
    

return
 pI;
}


//
IIDS
 

//
 {C225EDDE-ACFE-4349-AD2B-C7068731F8B3}


static
 
const
 IID IID_IX 
=
 

0xc225edde

0xacfe

0x4349
, { 
0xad

0x2b

0xc7

0x6

0x87

0x31

0xf8

0xb3
 } };


//
 {6E3A34D9-1E23-433b-A393-1A4A6A965C80}


static
 
const
 IID IID_IY 
=
 

0x6e3a34d9

0x1e23

0x433b
, { 
0xa3

0x93

0x1a

0x4a

0x6a

0x96

0x5c

0x80
 } };


//
 {D8CDFA09-D552-41b9-AA44-8A70D8554A5C}


static
 
const
 IID IID_IZ 
=
 

0xd8cdfa09

0xd552

0x41b9
, { 
0xaa

0x44

0x8a

0x70

0xd8

0x55

0x4a

0x5c
 } };


//
client


int
 main()
{

    HRESULT hr;
    trace(


client: Get an IUnknown pointer

);

    IUnknown 
*
 pIUnKnown
=
CreateInstance();
    trace(


client: Get interface IX

);

    IX
*
 pIX
=
NULL;
    hr

=
pIUnKnown
->
QueryInterface(IID_IX,(
void
 
**

&
pIX);
    

if
(SUCCEEDED(hr))
    {

        trace(


client:Succeeded getting IX

);
        pIX

->
Fx();
//
use interface IX


    }
    trace(


client: Get interface IY

);

    IY 
*
pIY
=
NULL;
    hr

=
pIUnKnown
->
QueryInterface(IID_IY,(
void
 
**

&
pIY);

    
if
(SUCCEEDED(hr))
    {

        trace(


client: Succeeded get IY

);
        pIY

->
Fy();
//
use interface IY


    }

    trace(

client:ask for an unsupporte interface

);

    IZ 
*
 pIZ
=
NULL;

    hr
=
pIUnKnown
->
QueryInterface(IID_IZ,(
void
 
**

&
pIZ);
    

if
(SUCCEEDED(hr))
    {

        trace(


client:succeeded in geting interface iz

);
        pIZ

->
Fz();
    }
    

else

    {

        trace(


client: could not get interface IZ

);
    }
    trace(


client: get interface IY from interface IX

);

    IY 
*
pIYfromIX
=
NULL;
    hr

=
pIX
->
QueryInterface(IID_IY,(
void
 
**
)
&
pIYfromIX);

    
if
(SUCCEEDED(hr))
    {

        trace(


client:succeeded getting IY

);
        pIYfromIX

->
Fy();
    }
    trace(


client: get interface IUNkown from IY

);

    IUnknown 
*
 pIUnknownFromIY
=
NULL;
    hr

=
pIY
->
QueryInterface(IID_IUnknown,(
void
 
**

&
pIUnknownFromIY);

    
if
(SUCCEEDED(hr))
    {

        cout

<<

Are the IUnknown pointers equal

;
        

if
(pIUnknownFromIY
==
pIUnKnown)
        {

            cout

<<

Yes,pIUnknownFromIY==pIUnknown

<<
endl;
        }
        

else

        {

            cout

<<

No,pIUnknownFrom IY!=pIUnknown

<<
endl;
        }
    }
    

//
Delete the component


    delete pIUnKnown;

    system(

pause

);
    

return
 
0
;

}

 

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

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

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


相关推荐

  • UML一一 类图关系 (泛化、实现、依赖、关联、聚合、组合)[通俗易懂]

    UML一一 类图关系 (泛化、实现、依赖、关联、聚合、组合)[通俗易懂]目录类图关系概述面向对象是符合人们对现实世界的思维模式,利用面向对象设计,特别是采用各种设计模式来解决问题时,会设计多个类,然后创建多个对象,一个设计良好的类,应该是兼顾信息和行为并且高内聚。而不同的类之间,应该做到松耦合。当面对应用系统或者需要解决的问题经常是复杂的、高度抽象的,我们创建的多个对象往往是有联系的,通常对象之间的关系可以分为以下几类:泛化关系实现关系依赖关…

    2022年7月12日
    21
  • 《Linux Device Drivers》 第十七章 网络驱动程序——note

    《Linux Device Drivers》 第十七章 网络驱动程序——note

    2022年1月1日
    57
  • 给力者基于51单片机的C语言教程,给力者单片机开发教程

    给力者基于51单片机的C语言教程,给力者单片机开发教程资源介绍给力者单片机开发教程给力者51单片机视频教程01:51单片机学前的准备工作1.mp4给力者51单片机视频教程01:51单片机学前的准备工作2.mp4给力者51单片机视频教程02:51单片机的C语言程序框架.mp4给力者51单片机视频教程03:51单片机的数字量输出1.mp4给力者51单片机视频教程03:51单片机的数字量输出2.mp4给力者51单片机视频教程04:51单片机的查表操作1.m…

    2022年6月7日
    30
  • csv格式怎么转成excel_比较好一点的Excel转PDF

    csv格式怎么转成excel_比较好一点的Excel转PDF需求说明假如有一个csv文件,打开之后不是想要的编码格式,或者一些数字全都是科学计数法计数。下面你按照下面文档一步一步操作就可以将CSV格式转化成EXCEL格式。1.新建一个excel空文档,如

    2022年8月1日
    9
  • 【SpringBoot】1、创建第一个SpringBoot项目

    【SpringBoot】1、创建第一个SpringBoot项目创建SpringBoot项目可以通过两种方式,1、通过访问:https://start.spring.io/,SpringBoot的官方网站进行创建SpringBoot项目;2、通过工具(例如:Idea)创建SpringBoot项目。本次使用开发工具:Idea创建我的第一个SpringBoot项目。首先,打开我们的Idea开发工具选择CreateNewPoject(创建一个新的项目)…

    2022年10月13日
    2
  • PS命令大全

    PS命令大全简介 Linux 中的 ps 命令是 ProcessStatu 的缩写 ps 命令用来列出系统中当前运行的那些进程 ps 命令列出的是当前那些进程的快照 就是执行 ps 命令的那个时刻的那些进程 如果想要动态的显示进程信息 就可以使用 top 命令 要对进程进行监测和控制 首先必须要了解当前进程的情况 也就是需要查看当前进程 而 ps 命令就是最基本同时也是非常强大的进程查看命令 使用该命令可以确定有哪些进程正在运

    2025年7月26日
    3

发表回复

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

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