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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 12个最好的JavaScript动画框架

    12个最好的JavaScript动画框架1.Scripty2scripty2是一个用于基于HTML的高级用户界面的开源JavaScript框架。或者简单地说,scripty2帮助你构建一个更美味的网络:视觉效果,UI组件和CSS实用程序。scripty2是script.aculo.us的完全重写和重新实现,具有模块化结构,旨在简化高度自定义的用户界面效果和行为的开发。2.JSAnimjsAnim

    2022年10月9日
    3
  • springboot 配置mybatis通用mapper

    springboot 配置mybatis通用mapper声明:此处为springboot配置mybatis的通用mapper方一共步其他多余操作不要有1添加mapper依赖一定要有以下依赖的jar包注意jar包版本,太高会导致功能不可用&lt;!–SpringBootMybatis依赖–&gt;&lt;dependency&gt;&lt;groupId&gt;org…

    2022年6月24日
    85
  • java 图片base64 转 pdf

    java 图片base64 转 pdf思路 base64 gt multipartFil gt pdfbase64 gt multipartFil 将图片 base64 gt MultipartFil parambase64 return publicstatic Stringbase64 try String baseStr base64 spli

    2025年6月24日
    3
  • rhel7+apache+c cgi+动态域名实现web访问

    1.申请动态域名/安装no-ip客户端https://blog.csdn.net/lee244868149/article/details/440958352.yum安装httpd两种方法安

    2021年12月29日
    34
  • idea里面怎么查看自己的激活码(注册激活)2022.03.11

    (idea里面怎么查看自己的激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月13日
    436
  • 【Custom Mutator Fuzz】libprotobuf-mutator安装

    【Custom Mutator Fuzz】libprotobuf-mutator安装在之前的文章中,主要使用AFL、AFL++和libfuzzer此类fuzzer进行模糊测试实验,结构化输入的时候依靠字节的变异可能会破坏输入数据整体的结构,那么就需要使用protobuf协助构建结构化输入

    2022年9月13日
    3

发表回复

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

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