queryinterface的用法
来源:互联网 发布:unity3d 弹出对话框 编辑:程序博客网 时间:2024/06/05 08:17
客户可以根据QueryInterface函数来查询某个组件是否支持某个特定的接口,若支持,则QueryInterface则返回一个指向特定接口的指针,若不支持,则返回一个错误代码,它的函数形是这样的:
HRESULT __stdcall QueryInterface(const IID& iid, void** ppv );
昨天已经设计了一个极其简单的QueryInterface函数,如下:
设计QueryInterface具有一些规则,虽然看来看去还是不太理解,但还是抄录如下:
1.QueryInterface返回的总是同一个IUnknown的指针。
2.若客户曾经获取过某个接口,那么它总能获取此接口。
3.客户可以再次获取已经拥有的接口。
4.客户可以返回到起始接口。
5.若能从某个接口获取某个特定接口,那么可以从任意接口获取此接口。
-----------------------------------------------------------------------------------------------------------------------------------------------------------
一些附加的知识点:
以前一直以为接口是抽象类中的方法或函数,其实是错的,按现在的理解来说,接口就是某个抽象类,而组件就是派生此接口并实现其方法的类。找到该接口就是看看该组件(简单点说就是派生类)中有没有为其抽象的父类提供实现方法。就像上一例,CA派生自抽象类IX,IY,IZ。可以说,IX,IY,IZ就是CA组件的接口,但是,CA类中只为IX,IY重载(override)了它们的方法Fx(),Fy(),并没有对IZ抽象类重载其方法Fz(),所以,通过QueryInterface,可以找到组件CA中有接口IX,IY,而找不到接口IZ。
在COM中,一个接口一旦确立并被客户使用后,这个接口就不会发生任何变化,至于为什么,搞不明白,可能是改变了之后,COM的二进制代码发生改变,而使客户调用不到正确的方法了吧!每一个接口都有一个全局标识符IID,一般情况下,我们不会去改变老的接口,如果有需要,可以为组件增加一个新的接口,并再分配之一个相应的IID号,当QueryInterface接收到对老IID的查询时,它返回的是老的接口,而接受到一个新IID的查询时,返回的就是新的接口,对于QueryInterface函数来说,一个IID就是一个接口。
HRESULT __stdcall QueryInterface(const IID& iid, void** ppv );
昨天已经设计了一个极其简单的QueryInterface函数,如下:
HRESULT CA::QueryInterface(const IID& iid,void** ppv)
{
if(iid==IID_IUnknown)
{
*ppv=static_cast<IX*>(this);
}
elseif(iid==IID_IX)
{
*ppv=static_cast<IX*>(this);
}
elseif(iid==IID_IY)
{
*ppv=static_cast<IY*>(this);
}
else
{
*ppv=NULL;
return E_NOINTERFACE;
}
static_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
{
if(iid==IID_IUnknown)
{
*ppv=static_cast<IX*>(this);
}
elseif(iid==IID_IX)
{
*ppv=static_cast<IX*>(this);
}
elseif(iid==IID_IY)
{
*ppv=static_cast<IY*>(this);
}
else
{
*ppv=NULL;
return E_NOINTERFACE;
}
static_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
设计QueryInterface具有一些规则,虽然看来看去还是不太理解,但还是抄录如下:
1.QueryInterface返回的总是同一个IUnknown的指针。
2.若客户曾经获取过某个接口,那么它总能获取此接口。
3.客户可以再次获取已经拥有的接口。
4.客户可以返回到起始接口。
5.若能从某个接口获取某个特定接口,那么可以从任意接口获取此接口。
-----------------------------------------------------------------------------------------------------------------------------------------------------------
一些附加的知识点:
以前一直以为接口是抽象类中的方法或函数,其实是错的,按现在的理解来说,接口就是某个抽象类,而组件就是派生此接口并实现其方法的类。找到该接口就是看看该组件(简单点说就是派生类)中有没有为其抽象的父类提供实现方法。就像上一例,CA派生自抽象类IX,IY,IZ。可以说,IX,IY,IZ就是CA组件的接口,但是,CA类中只为IX,IY重载(override)了它们的方法Fx(),Fy(),并没有对IZ抽象类重载其方法Fz(),所以,通过QueryInterface,可以找到组件CA中有接口IX,IY,而找不到接口IZ。
在COM中,一个接口一旦确立并被客户使用后,这个接口就不会发生任何变化,至于为什么,搞不明白,可能是改变了之后,COM的二进制代码发生改变,而使客户调用不到正确的方法了吧!每一个接口都有一个全局标识符IID,一般情况下,我们不会去改变老的接口,如果有需要,可以为组件增加一个新的接口,并再分配之一个相应的IID号,当QueryInterface接收到对老IID的查询时,它返回的是老的接口,而接受到一个新IID的查询时,返回的就是新的接口,对于QueryInterface函数来说,一个IID就是一个接口。
- queryinterface的用法
- QueryInterface 的实现规则
- QueryInterface的本质初探
- QueryInterface的本质初探
- QueryInterface的本质初探
- QueryInterface()
- QueryInterface
- 表驱动的QueryInterface(一)
- Iunknown的QueryInterface查询接口的作用
- IUnknown中的QueryInterface的实现剖析(1)
- IUnknown中的QueryInterface的实现剖析(2)
- 《COM技术内幕》代码之 接口的实现,QueryInterface的实现,QueryInterface的使用
- 《COM技术内幕》代码之 接口的实现,QueryInterface的实现,QueryInterface的使用
- QueryInterface 实现及使用的完整的例子
- ATL学习笔记(3): QueryInterface功能的实现
- COM编程中的接口查询QueryInterface的实现原理
- COM编程中的接口查询QueryInterface的实现原理
- COM编程中的接口查询QueryInterface的实现原理
- linux工作队列
- iPad应用用户体验设计指南
- ASH(Active Session History)——概述(1)!
- oracle学习记录之十
- install auto-complete-mode in emacs
- queryinterface的用法
- 如何设计一个优秀的儿童应用?
- 讨论:Web App是否需要专有图标
- html5初体验
- YII Framework学习教程-YII的Model-数据库操作2-多关系的CActiveRecord使用举例
- Java集合类详解
- Firefox 10上的开发工具与Chrome更相似
- 通过SQL存储过程删除过期的数据库Bak备份文件或其它文件
- 那个,在你颓唐不安的时候一直陪在你身边的我。