后绑定方式下对Object的处理

**后绑定方式下对 Object 的处理 **

CallByName , TypeName , CreateObject 以及 TypeLib 库的组合使用

在大多数的Visual Basic编程中,关于对象的操作都是在明确对象类型的情况下进行的,开发者会定义一个对象为某某类,这样就会很清楚使用的Object是属于什么类(Class),都有些什么属性(Property),有哪些方法(Method)。

但是有些时候也会有这样一种需求 , 要去实现一个操作不确定类型对象的函数 , 函数包含一个 As Object的参数 , 函数运行时也会有不确定类型的中间对象。这时候下面三个函数和一个DLL的组合会提供在后绑定模式下我们需要的帮助。

  1. TypeName (VarName) As String

这个函数将返回参数的数据类型 , 对于对象类型将返回该对象的类名。

例如:

Dim objRS As Recordset

Debug.Print TypeName(objRS)

将Print 出字符串 “Recordset”

  1. CreateObject(Class As String, [ServerName As String])

CreateObject这个函数比较常用 , 相对于直接定义一个对象 , 他的好处就是可以在后期通过一个字符串作为类的标示来创建对象。这样就可以在函数的运行期通过某种方式(当然也包括上面提到的TypeName函数)

确定具体要创建什么类型的对象 , 而不必在编码的阶段确定下来 , 因为那并不符合要求。

例如:

Set ObjNew = CreateObject(TypeName(p_objDest))

将在函数体的某一处创建一个与参数对象同类型的中间对象。

  1. Function CallByName(Object As Object, ProcName As String, _

CallType As VbCallType, [Args() As Variant])

在解决了类的问题后 ,还要面对的就是对Object的Method的调用。很显然仅仅Create 一个Object是不够的 , 但是对于不确定的类 , 具有的Method 也是不确定的 , 所以在函数体内也不可以写死。

CallByName函数就可以解决这个调用的问题。在函数运行时 , 通过某种方式(可能是传入的参数 ,也有可能使下面的TypeLib库提供的帮助)得知要使用的Method后的名字后 , CallByName 就可以使用这个Method的名字(字符串)对他进行调用。

例如:

CallByName(objDest , p_strMethodName , vbMethod , 12) ‘p_strMethodName = “Test”

将等同于 Call objDest.Test(12)

  1. TypeLib Information 库。

这个DLL可以用来对任意类型对象的属性及接口遍历 , 并且对这些接口进行十分细致的分解。

下面的代码是一个简单的使用TypeLib的例子:

Public Function GetPropFromObject(ByRef objDest As Object)

Dim objTypeLib As TLI.InterfaceInfo

Dim objProp As TLI.MemberInfo

Dim lngCnt As Long

On Error GoTo Error_Handler

‘ 读objDest 的接口信息

Set objTypeLib = TLI.InterfaceInfoFromObject(objDest)

lngCnt = 0

‘ 对读出的信息进行遍历

For Each objProp In objTypeLib.Members

‘ 过滤 , 每一个接口都属于特定的调用类型

‘ 这里为只Print该对象的Property Get类型的接口

If objProp.InvokeKind = INVOKE_PROPERTYGET Then

‘ objProp.Name 就是这个接口的名字

‘ 它可以返回给上面的CallByName , 当然这并不是唯一目的

Debug.Print lngCnt & " " & objProp.Name

End If

lngCnt = lngCnt + 1

Next

Exit Function

Error_Handler:

End Function

上面的三个函数和一个DLL , 可以在后绑定模式对象的使用上为我们提供很多帮助 , 加上用心的分析和设计 , 相信可以解决这一范围内的大多问题。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus