com技术内幕的一个疑惑,该怎么处理

com技术内幕的一个疑惑
各位,我在读com技术内幕时,在代理位置接口和非代理位置接口那里比较疑惑?
在组件聚合时,代理位置接口调用组件B(被聚合的组件)的接口IY时,用m_IUnknowInner->QueryInterface,这里m_IUnknowInner是组件B实例的地址,但组件B的QueryInterface中里调用的是m_IUnknowOuter->QueryInterface,这怎么又调回来了?
没看明白?

------解决方案--------------------
不要被相同的名字所困惑。你看支持聚合的组件时会看到两个结构完全一样的接口。
其中一个是IUnknown接口,这个两个接口的只是接口名和接口方法名不同而已。
但是它们的方法和参数在顺序安排上是一样。COM组件聚合就是靠它们了,如果没有
它们COM组件就无法支持聚合。
------解决方案--------------------
你看书不仔细,注意几个指针转换的地方。
------解决方案--------------------
我给你举个简单的例子吧。
interface IA

virtual long f1A() = 0 ; 
virtual long f2A() = 0 ;
} ;

interface IB

virtual long f1B() = 0 ;
virtual long f2B() = 0 ;
} ;

class C : public IA, public IB

public:
virtual long f1A(){ printf("f1A") ;} 
virtual long f2A(){ printf("f2A") ; }
virtual long f1B(){ printf("f1B") ; }
virtual long f2B(){ printf("f2B"); }
} ;

......

C c ;

IA *pIA = NULL ;
IB *pIB = NULL ;
void *p = NULL ;

pIA = (IA*)&c ;
pIB = (IB*)&c ;

//调用接口
pIA->f1A() ;
pIA->f2A() ;
pIB->f1B() ;
pIB->f2B() ;

p = (void*)pIB ;
pIA = (IA*) p ;
pIA->f1A() ; //注意这里的输出
pIA->f2A() ; //注意这里的输出
经过p指针转换后pIA指向的并不是C实现的IA接口,而是IB接口。
但是它可以以IA接口方式调用方法。原因是IA接口和IB接口在函数排列顺序和函数参数及参数顺序是一样的。