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)
上一篇 2022年6月29日 下午11:16
下一篇 2022年6月29日 下午11:16


相关推荐

  • Web跨域请求及其解决方案

    Web跨域请求及其解决方案目录一 理论概述 1 什么是跨域请求 Cross domainReques 2 浏览器的同源策略 Same originPolicy 3 存在的安全风险 4 CSRF 攻击简介二 跨域方案 1 跨域资源共享 CORS 1 CORS 简单请求 2 CORS 非简单请求 也称预检请求 HTTP 响应首部字段 Access Control Allow Or

    2026年3月19日
    1
  • coreseek,Sphinx,elasticsearch,xunsearch 什么关系

    coreseek,Sphinx,elasticsearch,xunsearch 什么关系

    2022年2月10日
    58
  • 【转】几个期货基本面因子的研究

    【转】几个期货基本面因子的研究几个期货基本面因子的研究引言随着传统中低频 CTA 策略的普及 尤其 16 年黑色的一大波行情后 越来越多的机构 个体都已经开始布局期货市场上的量化趋势策略 但不论是通道突破类策略 还是趋势指标 均线类策略 信号有效性对市场行情的依赖远大于研究员辛辛苦苦的策略调参 指标组合优化等等 甚至有的机构研究员戏称 趋势策略纯粹看天吃饭 只有一直坚持一波又一波的震荡亏损 才有可能等来一波赚钱的大行情 然而

    2026年3月19日
    1
  • 双线性插值 一文全讲解

    双线性插值 一文全讲解1、原理在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。  越是简单的模型越适合用来举例子,我们就举个简单的图像:33的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):2343822674…

    2022年5月5日
    56
  • Spring基于文心一言API使用的大模型

    Spring基于文心一言API使用的大模型

    2026年3月12日
    2
  • ES6新特性箭头函数语法、如何正确使用箭头函数

    ES6新特性箭头函数语法、如何正确使用箭头函数ES6 标准新增了一种新的函数 ArrowFunctio 箭头函数 基础语法通常函数的定义方法 varfn1 function a b returna b functionfn2 a b returna b 使用 ES6 箭头函数语法定义函数 将原函数的 function 关键字和函数名都删掉 并使用 gt 连接参数

    2026年3月19日
    2

发表回复

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

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