gpt4 book ai didi

c++ - 为什么通过同一个 COM 对象的不同接口(interface)检索到的 IUnknown* 指针具有相同的值?

转载 作者:可可西里 更新时间:2023-11-01 14:44:25 28 4
gpt4 key购买 nike

我有以下 COM 接口(interface)层次结构和一个实现它们的类:

interface IX : public IUnknown{};
interface IY : public IUnknown{};
class CA: public IX, public IY{};

这里 class CA 有效地继承自 IUnknown 两次。

我们知道在 class CA 中有两个 vtable 指针 - 一个指向 IX,另一个指向 IY。所以 IX 子对象中存储的 IUnknownIY 子对象中存储的 IUnknown 是不同的。

然而,当我们在同一对象上调用 IX::QueryInterface()IY::QueryInterface() 并查询 IUnknown 时,我们得到相同的 IUnknown* 指针。

为什么会这样?

最佳答案

这就是所谓的"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
}
}

关于c++ - 为什么通过同一个 COM 对象的不同接口(interface)检索到的 IUnknown* 指针具有相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5753000/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com