sha*_*oth 5 c++ windows com multiple-inheritance visual-c++
假设我有实现两个或多个COM接口(完全是一类在这里):
class CMyClass : public IInterface1, public IInterface2 {
};
Run Code Online (Sandbox Code Playgroud)
QueryInterface()
必须为同一个接口的每个请求返回相同的指针(它需要一个显式的upcast以进行正确的指针调整):
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;
}
Run Code Online (Sandbox Code Playgroud)
现在IUnknown
对象中有两个- 一个是基础,IInterface1
另一个是基础IInterface2
.而他们在不同的子对象.
让我们假设我打电话QueryInterface()
了IInterface2
-返回的将是从指针不同的指针返回当我打电话QueryInterface()
了IUnknown
.到现在为止还挺好.然后我可以通过将检索IInterface2*
到的任何函数接受IUnknown*
并由于C++的隐式转换的指针将被接受,但将不是相同的指针QueryInterface()
用于IUnknown*
将检索.事实上,如果该函数调用QueryInterface()
了IUnknown
在被调用时,它将检索不同的指针马上.
这在COM方面是合法的吗?当我有一个指向多重继承对象的指针并允许隐式向上转换时,如何处理这种情况?
COM 没有关于接口标识的规则,只有对象标识。QI 的第一条规则规定,如果两个接口指针上的 IID_Unknown 上的 QI 由同一对象实现,则它们必须返回相同的指针。您的 QI 实施正确地做到了这一点。
如果没有接口标识的保证,COM 方法就不能假定它获取的 IUnknown 指针与它在该指针上调用 QI 时将检索的指针相同。因此,如果需要证明对象身份,则需要单独的 QI。
归档时间: |
|
查看次数: |
1006 次 |
最近记录: |