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;

}

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

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

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

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

(0)


相关推荐

  • ms17010利用失败解决一则

    ms17010利用失败解决一则没有反弹得到session并且提示如下:  [-]10.0.131.2:445-Servicefailedtostart,ERROR_CODE:216换了一个payload  setpayloadwindows/meterpreter/reverse_tcp  setpayloadwindows/x64/meterpreter/bind_tc…

  • TS文件解码TS文件解密TS流批量下载和解码工具

    TS文件解码TS文件解密TS流批量下载和解码工具TS的全称则是TransportStream,即传输流,DVD节目中的MPEG2格式,是MPEG2-PS,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。现主流视频网站都采用这种模式。m3u8是一个TS切片列表文件,它记录视频的每个切片的时长与顺序,下面通过图片了解一下:怎么得到视频网站中的m3u8文件呢?…

  • ubuntu18.04安装ros melodic_ubuntu opengl

    ubuntu18.04安装ros melodic_ubuntu opengl软硬件(1)软件:装有ROS_melodic的Ubuntu18.04系统(2)硬件:台式机和kinectV1摄像头下载安装以及遇到的问题主要参考:https://blog.csdn.net/qq_29828623/article/details/60765043#PrepareWorkspacesource/opt/ros/melodic/setup.bashmkdir-p~…

  • Linux 简单命令操作 笔记

    Linux 简单命令操作 笔记

  • 空间回归与地理加权_地理加权回归处理点数据

    空间回归与地理加权_地理加权回归处理点数据本章有数学公式……对数学过敏者慎入……前文再续,书接上一回……上一次说到,在改进全局回归的基础上,GWR终于横空出世了,从此空间分析领域终于有了自己专用的回归算法。如果说,空间统计有别于经典统计学的两大特征:空间相关性和空间异质性,莫兰指数等可以用来量化空间相关性,那么地理加权回归,就可以用来量化空间异质性。在对全局回归问题的改进中,局部回归可以说是最简单的方法,GWR继续应用了局

  • 编码风格:Mvc模式下SSM环境,代码分层管理

    编码风格:Mvc模式下SSM环境,代码分层管理

    2020年11月20日

发表回复

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

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