列出对象的方法和属性(List object methods and properties)

2019-08-06 16:48发布

有什么办法可以列出在VBS创建的对象可用的方法?

例如:

Set IE = CreateObject("InternetExplorer.Application")

我想列出此对象的可用属性,如:

IE.AddressBar
IE.Application
IE.Busy
...

或方法:

IE.ClientToWindow
IE.ExecWB
IE.GetProperty
...

我怎样才能发现在VBS可用的属性任意有效的对象?

Answer 1:

VBScript中本身不支持类型反省外面TypeNameVarType的功能,它会给你一个对象的类型,但不会给你访问它的内部结构。

至于其他的答案解释也将提供此功能的DLL,但它不与Windows船,因为它是一个老版本的Visual Studio的一部分,可能没有时下获得它一个合法的方式。



Answer 2:

虽然这部分是真实的,它不完全....谷歌,GetObjectText_,Methods_,与Propeties_

引用的方法将只收集而连接到经由WbemScripting.SWbemLocator对象的远程主机的cimv2命名空间对象。 如果该对象必须在本地主机上工作的能力,这不明显给我。

一旦你这样做,你可以查询任何保存在其中的类[Win32_Services,Win32_Drives等],并使用类似下面的物体上for-next循环询问在ResultSet对象...

For Each oProp in oObject.Properties_
    'be careful here because some propeties may be an object or an array.
    'so test for that here using "typename" or "vartype"
    wScript.Echo oProp.Name & vbTab & oProp
Next

要么...

For Each oMethod in oObject.Methods_
    wScript.Echo oProp.Name
Next

最后,...

For Each oProp in oObject.Properties_
   'This will display all of an objects properties
   oProp.GetObjectText_
Next


Answer 3:

使用TypeLib Information Objectstlbinf32.dll它可以列出一类的所有成员。

tlbinf32.dll的Visual Studio 6.0,这是在几年当前版本2000年左右微软似乎不提供了下载的DLL(情况2017年中期)的一部分,但你可以从互联网上各种网站上下载它。 我发现版本1.1.88.4,构建8804,版权所有马修Curland 1996年,微软1997 - 2000年规模148.480个字节 https://www.dll4free.com/tlbinf32.dll.html ,或其他网站。

要安装在Win32中的DLL,它复制到%windir%\System32 ,并以管理员身份调用regsvr32.exe tlbinf32.dll从该目录。

为了insttall在Win64中的DLL,它复制到%windir%\syswow64 ,然后以管理员身份注册%windir%\syswow64\regsvr32.exe ,最后运行使用VBScript %windir%\syswow64\cscript.exe (或wscript.exe )。 感谢BuvinJ的提示

下面的脚本演示所包括的功能VariableInfo这将返回一个字符串与传递的变量的类型,并且在一个对象,与细节所有成员,包括患者的类型的情况下Property ,可调用类型( SubFunction ),和参数名称和在功能的情况下返回类型。 在的情况下,该对象的类型名称COM对象将是实现的接口的名称。 不知道这是否适用于多种实现的接口,但据我所知这是不可能实现多个接口通过一个类COM反正。

它不支持递归以任何方式,因为这将导致无穷循环对某些类型。

会给你在VBS几乎完全工作的反映 。 伟大的探索,例如与微软脚本调试器的API。

' Reflection for VBScript via tlbinfo32.dll
'
' Patrick Strasser-Mikhail 2017-2019
' Ansgar Wiechers 2019
' https://stackoverflow.com/questions/14305750/list-object-methods-and-properties/44459670#44459670

Option Explicit

' Returns a String describing the passed object/variable on the first level, no recursion.
Function VariableInfo(obj)
    Const invokeKindPropertyGet = 0
    Const invokeKindFunction = 1
    Const invokeKindPropertyPut = 2
    Const invokeKindPropertyPutRef = 4

    If isEmpty(obj) Or _
       isNull(obj) _
    Then
        VariableInfo = TypeNameFromVarType(VarType(obj))
    ElseIf Not IsObject(obj) Then
        If Not isArray(obj) Then
            VariableInfo = TypeNameFromVarType(VarType(obj)) & ", Value: " & obj
        Else

            VariableInfo = TypeNameFromVarType(VarType(obj)) & "("
            Dim dimension
            Dim size

            On Error Resume Next
            Err.Clear

            For dimension = 1 To 10 ' deliberate limit to prevent infinite loop
                size = Ubound(obj, dimension) + 1
                If Err.Number <> 0 Then
                    Exit For
                End If
                If dimension > 1 Then
                    VariableInfo = VariableInfo & ","
                End If
                VariableInfo = VariableInfo & Ubound(obj, dimension)
            Next

            On Error Goto 0

            VariableInfo = VariableInfo & ")"
        End If
    ElseIf TypeName(obj) = "Nothing" Then
        VariableInfo = "Nothing (The Invalid Object)"
    Else
        Dim TLI
        Dim MemberInfo
        Dim TypeInfo
        Set TLI = CreateObject("TLI.TLIApplication")
        VariableInfo = "Object " & TypeName(obj)

        On Error Resume Next
        Err.Clear
        Set TypeInfo = TLI.InterfaceInfoFromObject(obj)

        If Err.Number <> 0 Then
            VariableInfo = VariableInfo & "; Error " & Err.Number
            VariableInfo = VariableInfo & ": " & Err.Description
            Err.Clear
            Exit Function
        End If

        For Each MemberInfo In TypeInfo.Members
            Dim Desc
            Desc = ""
            Select Case MemberInfo.InvokeKind
                Case InvokeKindFunction
                    If MemberInfo.ReturnType.VarType <> 24 Then
                        Desc = "  Function " & TypeNameFromVarType(MemberInfo.ReturnType.VarType)
                    Else
                        Desc = "  Sub"
                    End If

                    Desc = Desc & " " & MemberInfo.Name
                    Dim ParameterList
                    ParameterList = Array()
                    Dim Parameter
                    For Each Parameter In MemberInfo.Parameters
                        ReDim Preserve parameterList(UBound(ParameterList) + 1)
                        ParameterList(Ubound(parameterList)) = Parameter.Name
                    Next
                    Desc = Desc & "(" & Join(ParameterList, ", ") & ")"
                    'Set parameters = Nothing
                Case InvokeKindPropertyGet
                    Desc = "  Property " & MemberInfo.Name
                Case InvokeKindPropertyPut
                    Desc = "  Property (set/get) " & MemberInfo.Name
                Case InvokeKindPropertyPutRef
                    Desc = "  Property (set ref/get) " & MemberInfo.Name
                Case Else
                    Desc = "  Unknown member, InvokeKind " & MemberInfo.InvokeKind
            End Select
            VariableInfo = VariableInfo & vbNewLine & Desc
        Next

        Set TypeInfo = Nothing
        Set TLI = Nothing
    End If
End Function

' Decode Type Number to something readable
Function TypeNameFromVarType(typeNr)
    Dim typeDetails
    set typeDetails = CreateObject("Scripting.Dictionary")

    typeDetails.add 0,  "vbEmpty (uninitialized variable)"
    typeDetails.add 1,  "vbNull (value unknown)"
    typeDetails.add 2,  "vbInteger" ' Short?
    typeDetails.add 3,  "vbLong" ' Integer?
    typeDetails.add 4,  "vbSingle"
    typeDetails.add 5,  "vbDouble"
    typeDetails.add 6,  "vbCurrency"
    typeDetails.add 7,  "vbDate"
    typeDetails.add 8,  "vbString"
    typeDetails.add 9,  "vbObject"
    typeDetails.add 10, "Exception"
    typeDetails.add 11, "vbBoolean"
    typeDetails.add 12, "vbVariant"
    typeDetails.add 13, "DataObject"
    typeDetails.add 14, "vbDecimal"
    typeDetails.add 17, "vbByte"
    typeDetails.add 18, "vbChar"
    typeDetails.add 19, "ULong"
    typeDetails.add 20, "Long" ' realy Long?
    typeDetails.add 24, "(void)"
    typeDetails.add 36, "UserDefinedType"

    If typeDetails.Exists(typeNr) Then
        TypeNameFromVarType = typeDetails(typeNr)
    ElseIf typeNr > 8192 Then
        TypeNameFromVarType = "vbArray{" & TypeNameFromVarType(typeNr - 8192) & "}"
    Else
        typeNameFromVarType = "Unknown Type " & typeNr
    End If
End Function

' Some nice example class to demonstrate all possible interfaces.
Class MyClass
    Dim Name_
    Dim Name2_

    Public Property Get Name
        Name = Name_
    End Property

    Public Property Let Name(ByVal Value)
      Name_ = Value
    End Property

    Public Property Let Name2(ByRef Value)
      Set Name2_ = Value
    End Property

    Sub TestSub()
        WScript.Echo "Test"
    End Sub

    Sub TestFunc(message)
        WScript.Echo "Test: " & message
    End Sub

    Sub TestFunc2(ByRef message)
        WScript.Echo "Test: " & message
    End Sub

    Function Add(first, second)
        Add = first + second
    End Function

    Function Substract(ByVal first, ByRef second)
        Add = first - second
    End Function
End Class

Sub testVariableInfo()
    Dim variable
    ' vbEmpty
    Wscript.Echo VariableInfo(variable)

    variable = Null
    Wscript.Echo VariableInfo(variable)

    Set variable = Nothing
    Wscript.Echo VariableInfo(variable)

    Dim MyObject
    Set MyObject = new MyClass
    Wscript.Echo VariableInfo(MyObject)
    Set MyObject = Nothing

    Dim TestA1(3, 7)
    Wscript.Echo VariableInfo(TestA1)
    Dim TestA2()
    Wscript.Echo VariableInfo(TestA2)

    Dim TestA3
    TestA3 = Array(4, 5, 6)
    Wscript.Echo VariableInfo(TestA3)
End Sub

testVariableInfo

对于有关类型库接口的详细信息,请从文档帮助文件的Microsoft知识库artivle 224331

马修Curland提供下载的网站,他的书高级的Visual Basic 6 nice程序类型库编辑器(EditTLBEval.exe)作为评估版本,并根据该文件

特别是在这方面,我真的很喜欢行如果你是一个Visual Basic开发谁拒绝承认VB普遍接受的局限性,这本书肯定是你。 特德派特森。 刚刚更换的VBScript VB这里。

VBWebProfi给了暗示的TLI,感谢。 工作出细节,并编写代码是几个小时的工作,虽然;-)



Answer 4:

如果你碰巧使用HP UFT或QTP然后按照下列步骤:

1)安装MS Visual Studio中的任何版本安装到你的笔记本电脑。 (不要担心牌,你将不会被运行VS)

2)重新启动计算机。

3)启动UFT或QTP,加载脚本和命中F11(或在任何一段代码是要检查对象附近暂停)。

4)对象添加到监视窗口。 它可以是一个对象库对象或方案说明。

如果对象存在,对象现在会显示两个加号(+)在监视窗口迹象表明,可以扩展到显示所有可用的方法和属性,以及子对象是可以扩大。



Answer 5:

使用TLI。 该TLI.TLIApplication类(从tlbinf32.dll )可以从它们的实例检查各种COM对象。 探索在Excel或支持脚本并有一个脚本编辑器,它能够添加引用其他Microsoft产品的TLI库,再加入tlbinf32.dll 。 在参考文献中的名称是“类型库的信息”。

需要注意的是DLL不能与Windows出货,虽然。

使用方法InterfaceInfoFromObject() VBScript的类和或者尝试ClassInfoFromObject()

Option Explicit

Dim TLI
Dim MyObject
Dim TypeInfo
Dim MemberInfo

Set TLI = CreateObject("TLI.TLIApplication")
Set MyObject = New MyClass
Set TypeInfo = TLI.InterfaceInfoFromObject(MyObject)

For Each MemberInfo In TypeInfo.Members
    WScript.Echo MemberInfo.Name
Next

Class MyClass
    Dim Name_

    Public Property Get Name
        Name = Name_
    End Property

    Public Property Let Name(ByVal Value)
        Name_ = Value
    End Property
End Class


Answer 6:

试试这个 ...

For i = 0 To webElementCount-1 Step 1

  innertextProp = myValue2(i).GetROProperty("innertext")
  print i & innertextProp
  print innertextProp

Next


文章来源: List object methods and properties