后期绑定与前期绑定

后期绑定

  将对象分配给一个声明为objcet类型的变量,若将一个变量声明为variant or object , 包括as form,as control变量,vb编译时就无法确定该变量讲引用那种类型的对象,应用程序只能在运行时确定对象的属性和方法。

  使用后期绑定,每次调用属性或者方法时,vb都将成员名传给该对象IDispatch接口的方法-GetIDsOfNames方法,GetIDsOfNames返回 该成员的id或者DispId,vb程序再将DispID传给IDispathch接口的Invoke方法来调用该成员。

  对于进程外部件而言,这就意味着一次额外跨进程调用,调用开销增大。

(idispatch接口:IDispatch接口把所有成员函数的入口地址放入到一个数组中,并且内部组织了一个Map,将数组索引和方法名称一一影射,DispId(COM 事件或者函数的调度 ID)就是这些方法在数组中的索引。通过DispId可以找到该方法的地址,调用该方法。

如,Dim oAutoCAD As Object
Set oAutoCAD = GetObject(, “Autocad.Application”)

前期绑定

  VB在编译时就知道属性或者方法的所在对象。

  前期帮定预先知道函数成员在类型中的DispID,不需要调用GetIDsOfNames方法。而且早期绑定允许程序在编译时分配内存,或者进行其他优化,从而生成更高效的应用程序。

如,Dim oAutoCAD As AcadApplication
Set oAutoCAD = GetObject(, “Autocad.Application”)

 使用比较

  可见,前期绑定的效率高于后期绑定的效率,在进程内创建对象,据说速度比例是2:3。而且前期绑定,在集成开发环境下,方法成员会自动显示。前期绑定会减少运行时的错误,但前期绑定时,在vb下需要引用dll文件或tlb文件,如果被引用的组件不存在,整个引用程序也不能运行,如果是后期绑定,只要在创建对象createobect时才会出错。前期帮定时,如果被引用组件版本不同,可能会有兼容性问题,但是如果是后期绑定,则没有问题。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注