荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: oopilix (冬眠的抽象实例), 信区: Visual
标  题: [zz]《COM技术内幕》学习笔记(4)
发信站: 荔园晨风BBS站 (Mon Oct 20 13:28:36 2003), 站内信件


原作者姓名 雷神
文章原始出处 http://www.ai361.com

介绍
知识的增长就是在厚、薄,明白、疑惑之间来回反复中获得的。


正文
第四部分
    这是这篇笔记的第四篇,雷神想要做的是将《COM技术内幕》这本书读薄,因
此才会有了这个笔记,它无非是将在书本上用荧光笔画出的重点,归纳整理了一下
,以便理清楚一个思路。但真正想理解COM组件的技术内幕,还需要将这本书读厚
(忘记那位名人说的了)。知识的增长就是在厚、薄,明白、疑惑之间来回反复中
获得的。
    用包容和聚合对组件进行改造,很象用两个半加器和一个或门重新组成了全加
器。

FAQ28:COM是否支持继承?〖第八章〗
FAQ29:什么是包容和聚合?〖第八章〗
FAQ30:包容的实现?〖第八章〗
FAQ31:聚合的实现?〖第八章〗
FAQ32:内部组件的实现?〖第八章〗
FAQ33:释放外部组件指向内部组件的接口指针的过程?〖第八章〗
FAQ34:什么叫盲聚合?〖第八章〗
FAQ35:关于包容和聚合的其他问题?〖第八章〗

Question:
    COM是否支持继承?
Answer:
    COM不支持类型继承。也就是实现继承。
    COM支持接口继承,这种继承指一个类继承其基类或接口。
    抽象基类是一种纯粹的接口继承。
    可以用组件包容来模拟实现继承。

Question:
    什么是包容和聚合?
Answer:
    包容和聚合可以使我们对组件进行改造。
    包容和聚合是一个组件使用另一个组件的技术。
    被调用的组件被称为内部组件,调用它的组件被称为外部组件。
    包容就是外部组件包含内部组件的接口,外部组件仅仅是内部组件的客户,它
将使用内部组件的接口来实现它的接口。
    聚合就是外部组件聚合内部组件的接口,外部组件直接把内部组件的接口返回
给客户。
    对聚合的每一个接口,可能会包容成百上千的其他接口。
    聚合和包容可以混合起来使用。

Question:
    包容的实现?
Answer:
    在外部组件加入一个新的方法Init,它调用CoCreateInstance来创建内部组件

    在此函数调用时外部组件请求内部组件的一个指定接口指针,例如IY。
    若调用成功,则此接口指针将被保存到一个数据成员中,例如m_pIY。
    当客户调用组件的IY接口时,外部组件将返回IY接口的指针。
    当客户请求组件的IY接口时,外部组件将请求转发给内部组件。代码如下:
    virtual void Fy(){m_pIY->Fy();}
    同时组件的类厂在创建外部组件后调用外部组件的Init函数。
    包容的主要用途是在已有的接口上加一些代码以便扩展这个接口

Question:
    聚合的实现?
Answer:
    聚合是包容的特例。
    聚合同样需要一个新的方法Init。
    当客户调用组件的IY接口时,外部组件向内部组件请求查询此接口。
    将得到的指针返回给客户。
    客户可以直接使用此指针调用内部组件实现的IY成员函数。
    实现聚合的关键在于QueryInterface函数。
    我们必须将内部组件的IUnknown隐藏,而只提供单个的IUnknown,否则会发生
混乱。
    内部组件的接口必须使用外部组件实现的IUnknown接口,此接口被称为外部或
控制Unknown接口。
    这时需要用到CreateInstance函数的pUnknownOuter参数给内部组件传递
IUnknown接口指针。
    通过传给CreateInstance函数的IUnknown接口指针,被创建的组件得知它是被
聚合的。
    被聚合的组件实现了两个IUnknown接口。其中内部组件的IUnknown被进行了修
改。并且将内部组件的this指针转换成修改后的内部组件的接口指针。
    这样做我们便可以保证返回的是一个非委托unknown指针。
当需要向非委托unknown接口指针查询IID_IUnknown接口时返回的总是指向自己的
指针。

Question:
    内部组件的实现?
Answer:
首先是调用外部组件的Init函数。
然后是内部组件类厂的CreateInstance函数。
最后是内部组件的构造函数。

Question:
    释放外部组件指向内部组件的接口指针的过程?
Answer:
    首先保证组件不会再次将自己释放。
    其次对外部组件调用AddRef。因为对内部组件调用Release将会导致对外部组
件的Release的调用。
    最后才能将外部组件释放。

Question:
    什么叫盲聚合?
Answer:
    外部组件聚合了内部组件实现的多个接口。
    外部组件放弃了它对暴露给客户的内部组件接口的控制权。
    建议尽量不使用盲聚合。

Question:
    关于包容和聚合的其他问题?
Answer:
    内部组件通过一个能够让外部组件查询其内部状态信息的接口以简化定制。
    我们可以用增加新的接口替代虚函数。许多情况下虚函数被当作回调函数来使
用。
    组件可以定义一个接口并调用它,以实现对自身的定制。


--


 ※ IP来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM oo.pi.li.x]
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 61.144.235.39]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店