COM聚合的实现
2008-01-11 00:03
274 查看
聚合指的是COM对象转接客户端对某个接口的请求。
某COM对象B并不实现ISomeInterface接口,但是可以通过调用某个内部COM对象A来支持该接口。意思是指,当客户端调用B所支持的接口IOtherInterface查询ISomeInterface时,直接将对象A的ISomeInterface接口指针传出去。
实现聚合的关键是COM对象在被聚合时的QueryInterface的处理。按照COM规范,通过接口查询到的IUnknown接口必须唯一。所以即便B对象不实现ISomeInterface接口,但是调用该接口查询到的IUnknown接口应当跟通过IOtherInterface查询到的一样。但因为实际上ISomeInterface是内部对象A的接口,所以为了符合规范,必须对A被聚合的情况进行特殊处理。
内部对象可以在外部对象初始化时通过CoCreateInstance函数创建,该函数的声明为:
STDAPI CoCreateInstance(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID * ppv
);
其中pUnkOuter指针用于指明该组件被聚合,并将外部对象的IUnknown接口指针传进来。这样,在内部对象进行查询的时候,以及AddRef,Release时,可以先判断外部IUnknown指针是否为空,若不为空,就要通过外部IUnknown指针调用QueryInterface,以及AddRef和Release。
某COM对象B并不实现ISomeInterface接口,但是可以通过调用某个内部COM对象A来支持该接口。意思是指,当客户端调用B所支持的接口IOtherInterface查询ISomeInterface时,直接将对象A的ISomeInterface接口指针传出去。
实现聚合的关键是COM对象在被聚合时的QueryInterface的处理。按照COM规范,通过接口查询到的IUnknown接口必须唯一。所以即便B对象不实现ISomeInterface接口,但是调用该接口查询到的IUnknown接口应当跟通过IOtherInterface查询到的一样。但因为实际上ISomeInterface是内部对象A的接口,所以为了符合规范,必须对A被聚合的情况进行特殊处理。
内部对象可以在外部对象初始化时通过CoCreateInstance函数创建,该函数的声明为:
STDAPI CoCreateInstance(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID * ppv
);
其中pUnkOuter指针用于指明该组件被聚合,并将外部对象的IUnknown接口指针传进来。这样,在内部对象进行查询的时候,以及AddRef,Release时,可以先判断外部IUnknown指针是否为空,若不为空,就要通过外部IUnknown指针调用QueryInterface,以及AddRef和Release。
相关文章推荐
- COM实现聚合所使用的C++技巧
- COM复用的中Containment(包容)和Aggregation(聚合)的实现
- COM技术内幕中聚合的实现
- COM实现聚合所使用的C++技巧
- COM复习(一) : COM复用的中Containment(包容)和Aggregation(聚合)的实现
- <com原理>与<com内幕>的聚合实现部分
- COM聚合的实现
- COM对象聚合的原生态实现(非向导)
- COM接口聚合实现解惑(C++虚表)
- <com原理>与<com内幕>的聚合实现部分。
- COM原理与应用中关于聚合实现的纪要
- COM实现聚合所使用的C++技巧
- 一个用MFC实现Com聚合样本
- 用MFC写的COM如何实现包容或聚合?
- <com原理>与<com内幕>的聚合实现部分。
- COM复用的中Containment(包容)和Aggregation(聚合)的实现
- 一个使用MFC实现Com聚合的例子
- ATL 实现com的聚合
- UML关系(泛化,实现,依赖,关联(聚合,组合))
- 【转】 UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合