本节将给出一些QueryInterface既的所有实现都必须遵循的一些规则,以便客户能够获取关于组件的足够多的知识并对之施实一些控制和其他有用的处理。如果没有这些规则,是不可能编写出组件的,因为在这种情况下,QueryInterface的行为将是不确定的。具体来讲,这些规则是:
QueryInterface返回的总是同一 IUnknown指针。
若客户曾经获取过某个接口,那么它将总能获取此接口。
客户可以再次获取已经拥有的接口。
客户可以返回到起始接口。
若能够从某个接口获取某特定接口,那么可以从任意接口都将可以获取此接口。
//
组件的实现只有一个IUnknown接口
BOOL SameComponents(IX * pIX,IY * pIY)
{
IUnknown * pI1 = NULL;
IUnknown * pI2 = NULL;
// 从PIX得到IUnknown接口
pIX -> QueryInterface(IID_IUnknown,( void ** ) & pI1);
// 从pIY得到IUnknown接口
pIY -> QueryInterface(IID_IUnknown,( void ** ) & pI2);
// 这两个指针相等吗?
return pI1 == pI2;
};
// 可以再次获取已经拥有的接口
void GetInterAgain(IX * pIX)
{
IX * pIX2 = NULL;
// 从IX查询IX接口
HRESULT hr = pIX -> QueryInterface(IID_IX,( void ** ) & pIX2);
assert(SUCCEEDED(hr));
};
BOOL SameComponents(IX * pIX,IY * pIY)
{
IUnknown * pI1 = NULL;
IUnknown * pI2 = NULL;
// 从PIX得到IUnknown接口
pIX -> QueryInterface(IID_IUnknown,( void ** ) & pI1);
// 从pIY得到IUnknown接口
pIY -> QueryInterface(IID_IUnknown,( void ** ) & pI2);
// 这两个指针相等吗?
return pI1 == pI2;
};
// 可以再次获取已经拥有的接口
void GetInterAgain(IX * pIX)
{
IX * pIX2 = NULL;
// 从IX查询IX接口
HRESULT hr = pIX -> QueryInterface(IID_IX,( void ** ) & pIX2);
assert(SUCCEEDED(hr));
};