QueryInterface函数

QueryInterface函数《COM技术内幕》§3——QueryInterface函数§3——IUnknown.CPP代码清单:////IUnkown.cpp//// #include#include voidtrace(constchar*msg){cout //InterfaceinterfaceIX:IUnknown

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

COM技术内幕》 §3 —— QueryInterface函数

§3 —— IUnknown.CPP代码清单:

//

//IUnkown.cpp

//

//

 

#include <iostream.h>

#include <objbase.h>

 

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

 

//Interface

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

         //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(“QueryInterface:Return pointer to IY.”);

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

         }

         else

         {

                   trace(“QueryInterface: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

//

//{32bb8320-b41b-11cf-a6bb-0080c7b2d682}

static const IID IID_IX =

         {0x32bb8320, 0xb41b, 0x11cf,

         {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};

//{32bb8321-b41b-11cf-a6bb-0080c7b2d682}

static const IID IID_IY =

         {0x32bb8321, 0xb41b, 0x11cf,

         {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};

//{32bb8322-b41b-11cf-a6bb-0080c7b2d682}

static const IID IID_IZ =

         {0x32bb8322, 0xb41b, 0x11cf,

         {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};

 

//

//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 getting IY.”);

                   pIY->Fy();       //Use interface IY

         }

                  

         trace(“Client:Get Interface IZ.”);

         IZ* pIZ = NULL;

         hr = pIUnknown->QueryInterface(IID_IZ,(void**)&pIZ);

         if(SUCCEEDED(hr))

         {

                   trace(“Client:Succeeded getting 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 IUnknown from IY.”);

         IUnknown* pIUknownFromIY = NULL;

         hr = pIY->QueryInterface(IID_IUnknown, (void**)&pIUknownFromIY);

         if(SUCCEEDED(hr))

         {

                   cout << “equal?” ;

                   if(pIUknownFromIY == pIUnknown)

                   {

                            cout << “Yes.” << endl;

                   }

                   else

                   {

                            cout << “No.” << endl;

                   }

         }

 

         //Delete the component

         delete pIUnknown;

         return 0;

}

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

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

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


相关推荐

  • idea查看激活码_通用破解码

    idea查看激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    61
  • C语言的字符串分割

    说起来很有意思,自认为对C语言理解得还是比较深刻的。但居然到今天才知道有个strtok函数,试用了一下突然感慨以前做了多少重复劳动。每次需要解析配置文件,每次需要分割字符串,居然都是自己去分割字符串,

    2021年12月24日
    40
  • linux下U盘文件系统类型的识别以及挂载

    手上有装好文件系统的CF一只,插上卡套,类比于U盘。1.先进入/mnt/目录新建一个usb目录cd/mnt/mkidrusb2.fdisk-l,然后插上U盘,fdisk-l查看是否有新的硬盘添加上来了?这时候我若是挂载是不知道sdb的文件类型的,也不清楚该挂载sdbx几。不需挂载就能查看的命令:

    2022年4月14日
    47
  • 2020年公认最快的dns(国内好用的dns)

    简介:2020国内速度最快的dns推荐原版周公解梦分析梦见儿子死了的吉凶境遇安全,推荐长辈惠泽,推荐承受父祖之余德,前辈之提拔,而得大成功及发展,原命若喜水木者更佳。若凶数者:成又转败,陷于离乱变动,至晚年终归孤独失败,又早年有落水灾遇,生涯九死一生之命格。国内又须戒色变及刀杀之危。梦到蛇和蛇一头,速度暗示你可能会受到别人的欺骗,或受到别人欺骗。最快梦见蛇的心理学解梦从做梦内容的本义来说:推荐动物…

    2022年4月13日
    201
  • python读取文件如何去除空格_python读取txt文件时怎么去掉空格

    python读取文件如何去除空格_python读取txt文件时怎么去掉空格python属于什么型语言python通过什么实现映射Python读取TXT文件可以通过replace()函数来去除TXT文件中的空格,基本结构:replace(to_replace,value)前面是需要替换的值,后面是替换后的值。代码如下:importosimportsys#os.chdir(‘E:\\’)#跳到D盘#ifnotos.path.exists(‘1.txt’):…

    2022年5月8日
    406
  • Doris Compaction机制总结

    Doris Compaction机制总结1 参考文档 Doris 最佳实践 Compaction 调优 1 Doris 最佳实践 Compaction 调优 2 Doris 全面解析 DorisCompact 机制解析按顺序读完这三篇文章 就能对 Doris 的 compaction 机制很熟悉了 2 总结 2 1 读写方式 2 1 1 写入 Doris 数据写入模型使用了 LSM Tree 随机写变为顺序写 面向写优化 数据追加的方式写入磁盘 2 1 2 读取读逻辑上 需要通过 Merge on Read 方式 2 2 3 compaction 目的

    2025年7月9日
    2

发表回复

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

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