【发布时间】:2011-03-12 04:09:21
【问题描述】:
假设我有一个实现两个或多个 COM 接口的类(完全如 here):
class CMyClass : public IInterface1, public IInterface2 {
};
QueryInterface() 必须为同一接口的每个请求返回相同的指针(它需要显式向上转换以进行正确的指针调整):
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IInterface1*>( this );
//call Addref(), return S_OK
} else if( iid == __uuidof( IInterface1 ) ) {
*ppv = static_cast<IInterface1*>( this );
//call Addref(), return S_OK
} else if( iid == __uuidof( IInterface2 ) ) {
*ppv = static_cast<IInterface2*>( this );
//call Addref(), return S_OK
} else {
*ppv = 0;
return E_NOINTERFACE;
}
现在对象中有两个IUnknowns - 一个是IInterface1 的基,另一个是IInterface2 的基。还有they are in different subobjects。
假设我为IInterface2 调用QueryInterface() - 返回的指针与我为IUnknown 调用QueryInterface() 时返回的指针不同。到目前为止,一切都很好。然后我可以将检索到的IInterface2* 传递给任何接受IUnknown* 的函数,并且由于C++ 隐式转换,该指针将被接受,但它与QueryInterface() for IUnknown* 检索的指针不同。事实上,如果该函数在被调用后立即为IUnknown 调用QueryInterface(),它将检索一个不同的指针。
这在 COM 方面是否合法?当我有一个指向多重继承对象的指针并且我允许隐式向上转换时,我该如何处理?
【问题讨论】:
-
实际上,我从未见过任何代码使用 COM 身份规则。也就是说,另一个 IUnknown* 是不合法的 - 您必须选择一个从 QueryInterface 返回。就您自己的、内部的、C++ 对 COM 对象实现对象的使用而言 - 如果您正在铸造,那么您无论如何都不会做 COM,所以您所做的任何事情都是合法的 C++,而不是合法的 COM。
-
@Chris Becke:我猜想实现一些类似缓存的功能需要身份。
标签: c++ windows visual-c++ com multiple-inheritance