前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有关QueryInterface函数

有关QueryInterface函数

作者头像
全栈程序员站长
发布2022-06-25 16:22:51
4450
发布2022-06-25 16:22:51
举报
文章被收录于专栏:全栈程序员必看

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

一,QueryInterface函数 原型:

HRESULT __stdcall QueryInterface(const IID&iid,void **ppv);

iid:标志客户所需的接口。是”一个接口标志符“结构(IID)。 ppv:QueryInterface用来存放所请求接口的地址。

返回值:可以返回S_OK 或 E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证是否成功。

使用方法:

假如知道一个指向IUnknown接口的指针pI,传给它一个接口标志符即可

例如:

代码语言:javascript
复制
void
 Foo(IUnknown 
*
 pI)
QueryInterface函数有关QueryInterface函数

{

QueryInterface函数    IX * pIX = NULL;
QueryInterface函数
QueryInterface函数    HRESULT hr = pI->QueryInterface(IID_IX,(void **)pIX);
QueryInterface函数
QueryInterface函数    if(SUCCEEDED(hr))
QueryInterface函数有关QueryInterface函数    {

QueryInterface函数      pIX->FX();
QueryInterface函数     }
QueryInterface函数}

QueryInterface函数
QueryInterface函数
//
QueryInterface的实现。

QueryInterface函数

QueryInterface函数HRESULT _stdcall  CA::QueryInterface(
const
    IID
&
iid,
void
 
**
ppv)
QueryInterface函数有关QueryInterface函数

{

QueryInterface函数    if(iid == IID_IUnknown)
QueryInterface函数有关QueryInterface函数    {

QueryInterface函数      *ppv = static_cast<IX *>(this);
QueryInterface函数    }
QueryInterface函数    else  if(iid == IID_IX)
QueryInterface函数有关QueryInterface函数    {

QueryInterface函数      *ppv = static_cast<IX *>(this);
QueryInterface函数    }
QueryInterface函数    else  if(iid == IID_IY)
QueryInterface函数有关QueryInterface函数    {

QueryInterface函数      *ppv = static_cast<IY *>(this);
QueryInterface函数    }
QueryInterface函数    else  if(iid == IID_IUnknown)
QueryInterface函数有关QueryInterface函数    {

QueryInterface函数      *ppv = NULL;
QueryInterface函数      return E_NOINTERFACE;
QueryInterface函数    }
QueryInterface函数
QueryInterface函数    static_cast <IUnknown *> (* ppv)->AddRef();
QueryInterface函数    retru S_OK;
QueryInterface函数
QueryInterface函数}
多重继承及类型转换。

通常将一种类型的指针转换为另一种类型并不会改变它的值。为了支持多重继承,某些情况下,C++必须改变类指针的值。
假如一个类定义如下:

class CA: public IX,public IY{…};

由于CA同时继承了IX,IY因此可以使用IX或IY指针的地方均可以使用指向CA的指针。

 

QueryInterface函数
void
 foo(IX
*
 pIX);
QueryInterface函数
void
 bar(IY
*
 pIY);
QueryInterface函数
int
 main()
QueryInterface函数有关QueryInterface函数

{

QueryInterface函数 CA* pA = new CA;
QueryInterface函数 foo(pA);
QueryInterface函数 bar(pA);
QueryInterface函数 delete pA;
QueryInterface函数 return 0;
QueryInterface函数}

QueryInterface函数

foo需要一个指向合法的IX的虚拟函数表的指针; bar需要一个指向合法的IY的虚拟函数表的指针; 当然IX和IY的虚拟函数表的内容是不一样的。因此将一个IX vtbl传给bar时,此函数是不能正常工作的。 因此编译器将同一指针传给foo和bar是不可能的,它必须对CA的指针进行修改以便他指向一个合适的vtbl指针。 下图显示了CA对象的内存结构。

2.jpg
2.jpg

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档