描述:
上面的问题,哪位能帮忙给解答一下,看了书还是不明白。
解决方案1:
非委托IUnknown实际上并不是一般意义上的IUnknown接口,它只是顶替聚合时IUnknown的真实实现,你完全可以使用其他的技巧顶替它(比如一个类或一个函数指针数组等等),IUnknown用来制定满足COM规则的接口查询和生命周期管理的行为,具体的实现与接口本身无关,非委托IUnknown就是提供这个实现的,所以说它不是一个严格意义上的接口,所以说没必要非用接口的形势实现它,这样使用只是一个技巧。
解决方案2: COM都被微软抛弃了,还研究啊?
假设对象A实现了IA接口,对象B实现了IB接口,A被B聚合。
如果我们得到了B的IB指针,根据IB::QueryInterface查询IA是很容易的,因为B只需要返回它的内部对象A的指针就可以了;
反过来如果我们得到了A的IA指针,根据COM原则,我们应该可以从A的IA::QueryInterface查询得到IB接口。但实际情况是A根本不知道它的外部对象是什么(A有可能是别人写好的组件),这就需要有一种机制,使得A在被聚合的时候,可以调用它的外部对象的IUnknown。
这种机制就是代理IUnknown。
代理IUnknown是对象A暴露在外边的IUnknown,它什么操作都不实现,只是转发客户的请求。当对象A没有被聚合时,它把请求转发给非代理IUnknown,由非代理IUnknown实现具体对象A的QueryInterface, AddRef, Release等操作;当对象A被外部对象聚合时,它把客户请求转发给外部对象的IUnknown指针,外部对象通过调用对象A的非代理IUnknown来控制对象A。
顺便说一句,外部对象的IUnknown指针是在CoCreateInstance()中传递进来的。
我的理解:
COM原则:“若能够从某接口获取特定接口,则从任意接口都将能够获取此接口”
代理IUnknown接口就是一个纯粹的、一般意义上的IUnknown接口,它在这个对象被另一个COM对象聚合时通过这个接口将对外部组件接口的调用请求转发给外部组件。
其中的非代理未知接口将按通常的方式实现内部组件的IUnknown接口功能(强调功能),负责内部组件引用计数、查询内部接口或内部组件方法调用等等。