IDispatch接口主要应用于传统的自动化编程,如著名的Microsoft Visual Basic。客户端程序只需得到COM组件的IDispatch接口就可调用组件所有的属性和方法。但IDispatch的局限在与它假定COM组件是静态的。也就是说,在运行期间,这些COM组件的属性和方法是不能改变的。因此,如果要实现javascript和vbscript脚本语言的动态特性,就需要一个更灵活的接口。
于是为脚本语言量身定制的IDispatchEx接口诞生了。IDispatchEx派生自IDispatch,除了支持IDispatch所约定的方法之外,还提供了一组扩展方法,用于支持脚本语言的动态特性,这些动态特性包括:
- 为object添加成员 ("expando") — 使用带fdexNameEnsure标记的方法 GetDispID.
- 删除object的成员 — 使用方法DeleteMemberByName 或者DeleteMemberByDispID.
- 支持大小写敏感的方法 — 使用fdexNameCaseSensitive标记或fdexNameCaseInsensitive标记..
- 使用隐含名搜索成员 — 使用fdexNameImplicit标记
- 枚举object所有成员的DISPID — 使用GetNextDispID.
- 通过DispID取得成员的名称 — 使用GetMemberName.
- 获取object成员的属性 — 使用GetMemberProperties.
- 使用执行带this指针的方法调用 — 使用方法InvokeEx.
-
- 允许支持命名空间概念的浏览器获取object的命名空间 — 使用方法GetNameSpaceParent.
其实在这里,IDispatchEx接口存在更重要的意义在于,使得我们有途径在VC++中访问并模拟动态脚本语言的特性。下面我们以javascript为例。
举例:
方法test()中的javascript代码执行以下动作:
调用Object的constructor(构造器)创建一个新的object,用变量Obj保存。
在object中创建一个新的成员Elem,并将Elem的值设为方法cat的指针。
调用Elem方法,传入this指针。因为Elem是Obj的成员,所以this指针就指向Obj。于是方法cat中的代码也就是为Obj设置了一个新的成员Bar,并赋值为10。
完整的HTML代码如下:
<HTML>
<BODY>