一、COM组件的目标:
COM组件的一个主要优势是:便于升级。
要实现这个优势需要满足一下两个条件:
1、运行时从客户程序动态加载和卸载,采用DLL技术可以实现。
2、为了更好的突出DLL的优势,还需要信息隐藏,即封装性。
二、COM组件的信息隐藏采用IUnknown接口来实现:
1、IUnknown接口功能简介:
IUnknown意思是未知,即未知的接口。采用这个名字是为了简单起见,所有的COM接口都需要继承IUnknown,因此若某个客户拥有一个IUnknown接口的指针,也就不知道接口到底是什么类型的,只需要知道此接口可以用来查询其他接口。IUnknown接口有一个用来查询接口的函数QueryInterface。由于所有的COM组件接口都从IUnknown接口继承,因此所有的接口都有QueryInterface函数,通过QueryInterface可以查询到任何接口,因此也就不需要单独维护一个代表组件的指针。
2、QueryInterface功能简介:
客户可以通过IUnknown中包含的QueryInterface函数查询某个组件是否支持某个特定的接口。
若支持,QueryInterface将返回指向此接口的指针。
否则,将返回一个错误代码。
然后,客户可以接着查询其它接口或将组件卸载。
3、QueryInterface函数遵循的规则:
QueryInterface的实现需要遵循一些规则,以便于客户能够获取关于组件的足够多的知识并对之实施一些控制和其他有用的处理。QueryInterface的行为必须是稳定的。
<1>、QueryInterface返回IUnknown接口时,总是返回同一IUnknown指针。
每个组件实例只有一个IUnknown接口,因此当查询组件实例的IUnknown接口时,不论通过那个接口查询,得到的均将是同一指针值。
总结:遵循这一规则能确定两个接口是否指向同一组件。
<2>、客户可以获取曾经得到过的接口。
若对于某个给定的接口,QueryInterface曾经成功过,那么对于同一组件的后续QueryInterface将总是成功的。
总结:若不遵循这一规则客户将无法通过编程的方法来决定组件到底有一些什么样的功能。
<3>、 可以再次获取已经拥有的接口,即通过A接口查询A接口指针。
<4>、 客户可以从任何接口返回到起始接口,即若通过A接口可以查询到B接口,那么可以通过B接口查询到A接口(对称性)。
<5>、若能够从某接口获取到某特定的接口,则从任意的接口都将能获取此接口(传递性)。
若可以从A接口查询到B接口,从B接口查询到C接口,那么可以从A接口查询到C接口。
总结:这条规则使得QueryInterface是可用的,即