有关于调度接口!!!!!!!!!!!!!!!!! (135分)

  • 主题发起人 主题发起人 ReallyFail
  • 开始时间 开始时间
R

ReallyFail

Unregistered / Unconfirmed
GUEST, unregistred user!
知道dispinterface跟IDispatch有很大的关系,也知道IDispatch有个Invoke方法。
但看了很多的资料都没看明白(本人比较笨?),为什么要将dispinterface单独做为
一个关键字,dispinterface跟IDispatch的实现机制跟普通的interface有什么区别。
Invoke方法到底是怎么回事,有什么意义??

以上问题虽然看起来比较多,但总的是围绕dispinterface跟IDispatch展开的。
如果知道的话希望你能大体上讲讲,并在关键处(你觉得算是理解上的难点)指点一下!
本想多给点分的,但我可用积分只有135分了。各位多包涵了
 
1.dispinterface被称为派遣接口,这种接口不需要实现,它只是IDispatch
接口的Invoke方法的外壳.
2.Invoke方法根据调用接口上成员的名字(GetIDsOfNames方法)或者序号(dispid)来决定具体调用Com组件
的什么方法,这个过程在调用的时候才发生,被称为晚绑定。
这带来了灵活性,但也有可能带来更多的错误,速度也比早绑定慢些.
3.实现IDispatch接口的基类是TAutoObject
 
>>它只是IDispatch接口的Invoke方法的外壳.//外壳
方法的外壳该怎么理解????

 
就是说在dispinterface接口定义的方法都可以通过Invoke方法调用,你可以到 ComObj
单元看,Invoke方法的第一个参数就是DispID.dispinterface接口定义的每个方法都有
DispID.
当你通过名称调用的时候,会先调用GetIDsOfNames方法取得成员的DispID,这当然比
直接用DispID调用慢一些.
 
用dispinterface实现的接口中,方法和属性都是通过固定的名字集来调用的,并没有为它
们实现虚拟方法表(VTBL).
而IDispatch实现的接口中,方法和属性既能以固定的名字集来调用,也可以通过VTBL调用
这样如果组件在VC等高性能的开发工具中就能有较快的速度,并且在脚本语言中也能使用
通接IDispatch接口使用它.
 
由于是晚绑定,dispinterface接口上发法在调用的时候无法做类型检查。直到调用
的时候才知道到底有没有这个方法,参数个数、类型是否正确。这有可能会带来运行
期错误.
而采用VTable方法编译的时候就会作检查,会给出编译错误。
 
自动化对象中有定义了一个dispinterface,又定义了一个与他一摸一样的interface,
如果将这个dispinterface定义删除编译也可以通过。
我把现在的理解说说看,两位大虾帮我看看我有没理解错:
自动化对象(比如是TMYAUTO)其实还是只实现了一个接口(继承自IDispatch的interface)
但因为这个接口是从IDispatch继承的,所以还要定义一个接口(dispinterface),
并在他的方法后加上DISPID,而这个接口存在的目的可能仅仅是给IDispatch接口中的
Invoke方法提供DISPID用的。而INVOKE这个方法可以根据DISPID调用本借口的其他的方法
 
如果实现了这个接口就是实现了所谓的双接口,
 
IDispinterface 称其为接口,是因为它的背后指明的是 IDispatch 接口的一个具体接口。
IDispinterface 本身仅仅是对 IDispatch 的一个编号,目的是让 IDispatch 直接可以通过
编号来调用,从而可以让不支持 vmt 的语言或应用,利用类似于 dll 的 index 调用方法
来调用一个具体的 IDispatch 。之所以说是类似于 dll 的 index 调用,而不是等同,主要
是这种调用,最后还必须由 IDispatch 接口给予确认。所以,实际上不需要对 IDispinterface
接口写代码去实现,它只是指明一个具体的 IDispatch 接口。因此,我同意 xeen 的观点。
 
多人接受答案了。
 
后退
顶部