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
;

}

 

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

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

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

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

(0)


相关推荐

  • int(11,2)_算法笔记视频

    int(11,2)_算法笔记视频week1伪代码与时间复杂度伪代码(PseudoCode)这部分略过,基本上表达出自己意思别人也能看懂就行时间复杂度(Timecomplexity)要注意的是f(n)和大O(g(n)),f(n)=O(g(n))算法频度f(n):该算法基本操作需要执行的次数辅助函数g(n):n取无穷时可近似f(n)—》limf(n)/g(n)等于常数时间渐进复杂度O(g(n)):时间复杂度,通常用O(n)表示运行算法的规模下图为展示了时间复杂度之间比较关系部分题型:给定一式子,要求

  • java中递归算法_java中递归算法是什么怎么算的?

    java中递归算法_java中递归算法是什么怎么算的?展开全部一、递归算法基本思路:Java递归算法是基于Java语言实现的递归算法。递归算法是一e5a48de588b662616964757a686964616f31333363373166种直接或者间接调用自身函数或者方法的算法。递归算法实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法表示问题的解。递归往往能给我们带来非常简洁非常直观的代码形式,从而使我们的编码大大简化,然而递归的思…

  • 项目随笔

    项目随笔

  • 《QTreeView+QAbstractItemModel自定义模型》:系列教程之三[通俗易懂]

    《QTreeView+QAbstractItemModel自定义模型》:系列教程之三[通俗易懂]1、了解常用的model类通过对上一节的阅读,我们知道只要具备model+view就可以显示数据。那么有哪些model类呢,从下图中我们可以看到Qt中模型类的层次结构QStandardItemModel:可以作为QListView、QTableView、QTreeView的标准model。QAbstractListModel:需要使用QListView显示数据,并配合自定义…

  • java clone()_java throwable

    java clone()_java throwable克隆是一种基本的编程模式。事实上,Java在很多方面可能实现得很差,但这丝毫没有减少克隆的必要性。而且,很容易实现克隆,无论你希望它如何工作,浅层的,深层的,混合的,无论什么。如果愿意的话,甚至可以为函数使用clone名称,而不实现Cloneable。假设我有类A、B和C,其中B和C是从A派生的。如果我有一个A类型的对象列表,如下所示:ArrayListlist1;ArrayListlist2…

    2022年10月10日
  • SQL server 查询语句「建议收藏」

    SQL server 查询语句「建议收藏」select*fromtest.dbo.users–普通条件查询whereid=1;模糊查询 select*fromtest.dbo.users whereusernamelike’%li%’;范围查询 select*fromtest.dbo.users –id在1~3之间的数据 whereidbetween1and3; select*fromtest.dbo.users –id在1~3以外的数据 where.

发表回复

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

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