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

转载 2007年09月23日 15:21:00

下面我们将把前面所提到过和各代码段组合起来,以构成一个说明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 = 
0xc225edde0xacfe0x4349, { 0xad0x2b0xc70x60x870x310xf80xb3 } };

// {6E3A34D9-1E23-433b-A393-1A4A6A965C80}
static const IID IID_IY = 
0x6e3a34d90x1e230x433b, { 0xa30x930x1a0x4a0x6a0x960x5c0x80 } };

// {D8CDFA09-D552-41b9-AA44-8A70D8554A5C}
static const IID IID_IZ = 
0xd8cdfa090xd5520x41b9, { 0xaa0x440x8a0x700xd80x550x4a0x5c } };

//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;


}

 

COM编程中的接口查询QueryInterface的实现原理

我们都知道,COM组件编程中,QueryInterface实现的接口之间的查询,通过这个接口,我们可以获取该组件中其他的接口。但是,QueryInterface实现的原理是什么呢,首先,我们看一下基本...
  • Andeewu
  • Andeewu
  • 2013年03月31日 17:12
  • 1377

C++程序员之路深入探讨QueryInterface

QueryInterface的本质初探 本文写给COM的初学者! QueryInterface接口对COM的重要性不言而喻,该接口的实现有个规则——由QueryInterface返回的IU...

IUnKNown接口——QueryInterface函数

COM笔记-QueryInterface函数 fangyukuan 2010.6.1 客户同组件的交互都是通过一个接口完成的。在客户查询组件的其他接口时,也是通过接口完成的。这个接口...

关于COM对象创建(CoCreateInstance,与QueryInterface)

panda2002-12-19 05:40 PM一个土问题,关于COM对象的创建 因为生活所迫,这几天必须对COM有所了解。今天看了之后,对COM对象的创建有所困惑。使用CoCreateInstanc...

IUnknown中的QueryInterface的实现剖析(1)

如题,写给我这样的COM初学者 QueryInterface的实现参考《COM技术内幕》p.35,我对里边的代码做了一些修改然后进行讲解。 // server.h # ifndef SERVER...

【COM学习】之一、QueryInterface

开始先说一句,学习com之前要学好c++ 对象模型。 QueryInterface的使用: QueryInterface是IUnknown的一个成员函数,客户可以通过此函数来查询某个组件是...

Linux C/C++ 模板:类模板成员特化

一、代码         不需要完全特化整个类,只特化相关函数即可。 #include #include #include #include using namespace std; //主...

关于类静态成员变量指针通过动态分配的内存如何回收的探讨

一个类假如存在一个静态成员变量指针,在以下几种情况下动态分配内存,该如何回收内存: 1)在外部函数中动态分配内存,代码如下: test.cpp class Test { public: ...
  • vgxpm
  • vgxpm
  • 2015年07月25日 00:54
  • 1558

利用全注解实现ssh的一个完整例子

在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。个人也不喜欢配置那么多的xml文件。下面我们就利用java的注...

CKEditor 在jsp中实现文件上传的完整例子

备注:转载请注明出处  CKEditor是一个优秀的网页编辑器,但网上的jsp实现上传的例子很少,经过几天的搜索与钻研,终于上传成功,特别感谢: http://topic.csdn.net/u...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QueryInterface 实现及使用的完整的例子
举报原因:
原因补充:

(最多只允许输入30个字)