为啥通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值?
Posted
技术标签:
【中文标题】为啥通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值?【英文标题】:Why do IUnknown* pointers retrieved through different interfaces of the same COM object have the same value?为什么通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值? 【发布时间】:2011-04-22 06:51:25 【问题描述】:我有以下 COM 接口的层次结构和一个实现它们的类:
interface IX : public IUnknown;
interface IY : public IUnknown;
class CA: public IX, public IY;
这里class CA
有效地从IUnknown
继承了两次。
我们知道class CA
中有两个vtable指针——一个指向IX
,另一个指向IY
。所以IUnknown
存储在IX
子对象中与IUnknown
存储在IY
子对象中是不同的。
然而,当我们在同一个对象上调用 IX::QueryInterface()
或 IY::QueryInterface()
并查询 IUnknown
时,我们会得到相同的 IUnknown*
指针。
为什么会这样?
【问题讨论】:
感谢您编辑我的问题,JaredPar。我的英语很差。非常感谢。 【参考方案1】:这就是所谓的"object identity" requirement,它指出,每当您从两个对象请求IUnknown
时,如果它们是不同的对象,则会得到不同的指针,如果是相同的对象,则会得到相等的指针。
每个QueryInterface()
实现都必须满足这个要求。这通常由choosing which one IUnknown
to return and sticking to it 完成:
HRESULT CA::QueryInterface( REFIID iid, void** ppv )
if( iid == __uuidof( IUnknown ) )
// Explicitly cast to one of base class subobjects.
// Doesn't matter which one is chosen - it just has to be
// the same base class subobject each time IUnknown is requested.
IUnknown* selected = static_cast<IX*>( this );
*ppv = selected;
AddRef();
return S_OK;
else
continue for other interfaces
【讨论】:
是的,但是我想知道 QueryInterface 如何在有多个 IUnknow 接口的情况下实现返回相同的 IUnknow 指针。 @kenny:很简单,他们每次只投给其中一个 - 请参阅问题链接。以上是关于为啥通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何将检索到的对象从 parse.com 传递到 NSMutableArray 以与 UITableView 一起使用?
我正在尝试在我的应用程序中实现搜索栏,以便我可以搜索从 parse.com 检索到的对象
jquery选择器$("...")返回的是数组,为啥还能继续练式操作$("...").方法 ?