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接口在函数排列顺序和函数参数及参数顺序是一样的。
各位,我在读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接口在函数排列顺序和函数参数及参数顺序是一样的。