QueryInterface()

转载 2012年03月31日 09:30:47
QueryInterface()

QueryInterface()简称QI(),由客户端程序调用这个函数从COM对象请求不同的接口。我们在例子代码中因为只实现一个接口,QI()会很容易使用。QI()有两个参数:一个是所请求的接口IID,一个是指针的缓冲大小,如果查询成功,QI()将接口指针地址存储在这个缓冲指针中。
HRESULT CUnknownImpl::QueryInterface ( REFIID riid, void** ppv ){HRESULT hrRet = S_OK;    // 标准QI()初始化 – 置 *ppv 为 NULL.    *ppv = NULL;    // 如果客户端请求提供的接口,给 *ppv.赋值    if ( IsEqualIID ( riid, IID_IUnknown ))        {        *ppv = (IUnknown*) this;        }    else        {        // 不提供客户端请求的接口         hrRet = E_NOINTERFACE;        }    // 如果返回一个接口指针。 调用AddRef()增加引用计数.    if ( S_OK == hrRet )        {        ((IUnknown*) *ppv)->AddRef();        }    return hrRet;}在QI()中做了三件不同的事情:1、初始化传入的指针为NULL[*ppv = NULL;]。2、检查riid,确定组件对象类(coclass)实现了客户端所请求接口.[if ( IsEqualIID ( riid, IID_IUnknown ))]3、如果确实实现勒索请求的接口,则增加COM对象的引用计数。[((IUnknown*) *ppv)->AddRef();]AddRef()调用很关键。    *ppv = (IUnknown*) this;
要创建新的COM对象引用,就必须调用这个函数通知COM对象这个新引用成立。在AddRef()调用中的强制转换IUnknown*看起来好像多余,但是在QI()中初始化的*ppv有可能不是IUnknown*类型,所以最好是养成习惯对之进行强行转换。。
上面我们已经讨论了一些DLL服务器的内部细节,接下来让我们回头看一看当客户端调用CoCreateInstance()时是如何处理服务器的。

QueryInterface的本质初探

转载请注明出处,版权归作者所有  lyzaily@126.com yanzhong.lee    本文写给COM的初学者! QueryInterface接口对CO...
  • liujiayu2
  • liujiayu2
  • 2015年04月16日 18:27
  • 321

COM编程中的接口查询QueryInterface的实现原理

我们都知道,COM组件编程中,QueryInterface实现的接口之间的查询,通过这个接口,我们可以获取该组件中其他的接口。但是,QueryInterface实现的原理是什么呢,首先,我们看一下基本...
  • Andeewu
  • Andeewu
  • 2013年03月31日 17:12
  • 1528

C++ 编程之QueryInterface函数(一)

前言 组件对外公布的是接口;一个组件可以实现多个接口,也就是说可以对外公布多个接口,之前也总结过了,你很少会100%的去完全了解一个组件的所有接口,就像你去学习编程一样,你几乎不可能去成为编程中...
  • sinat_32596537
  • sinat_32596537
  • 2016年12月14日 23:15
  • 197

ATL学习笔记(3): QueryInterface功能的实现

在CComObjectRootEx类中,实现了线程安全的引用计数管理。而在CComObjectRootEx的父类CComObjectRootBase中,存在对QueryInterface的一个内部实现...
  • DarkMagician_Potter
  • DarkMagician_Potter
  • 2014年06月04日 11:37
  • 818

com智能指针实现原理

智能指针的出现解决了对内存的释放问题,我们了解它的内存管理机制有利于我们理解C++、boost中的智能指针以及其他例如cocos中的内存管理。...
  • qq_30145355
  • qq_30145355
  • 2017年12月13日 22:45
  • 23

第一讲:COM接口与QueryInterface

来自:http://www.vckbase.com/index.php/video/listview/fid/2/sid/12 本节内容: 1、现实中的组件与接口 2、把现实中的思想融入到软...
  • s110600824s
  • s110600824s
  • 2013年02月22日 14:49
  • 375

COM学习笔记(一):入门及QueryInterface

#include 定义了-> #define interface struct #include 定义了-> #define pascal __stdcall //**************...
  • u010002704
  • u010002704
  • 2014年09月03日 10:14
  • 386

【COM学习】之一、QueryInterface

开始先说一句,学习com之前要学好c++ 对象模型。 QueryInterface的使用: QueryInterface是IUnknown的一个成员函数,客户可以通过此函数来查询某个组件是...
  • Jofranks
  • Jofranks
  • 2013年08月04日 18:02
  • 5875

QueryInterface的本质初探

转载请注明出处,版权归作者所有 http://blog.163.com/lyzaily@126/blog/static/4243883720100125293225/  lyzaily@126....
  • hemeinvyiqiluoben
  • hemeinvyiqiluoben
  • 2013年12月06日 10:08
  • 411

C#操作office组件(excel、word、ppt)报错问题!

最近发现了一个奇怪的问题,C#无法调用office的组件,提示报错,相关信息如下: Unable to cast COM object of type 'Microsoft.Office.Intero...
  • wangyineng
  • wangyineng
  • 2015年03月13日 14:32
  • 2176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QueryInterface()
举报原因:
原因补充:

(最多只允许输入30个字)