有什么办法可以列出在VBS创建的对象可用的方法?
例如:
Set IE = CreateObject("InternetExplorer.Application")
我想列出此对象的可用属性,如:
IE.AddressBar
IE.Application
IE.Busy
...
或方法:
IE.ClientToWindow
IE.ExecWB
IE.GetProperty
...
我怎样才能发现在VBS可用的属性任意有效的对象?
有什么办法可以列出在VBS创建的对象可用的方法?
例如:
Set IE = CreateObject("InternetExplorer.Application")
我想列出此对象的可用属性,如:
IE.AddressBar
IE.Application
IE.Busy
...
或方法:
IE.ClientToWindow
IE.ExecWB
IE.GetProperty
...
我怎样才能发现在VBS可用的属性任意有效的对象?
VBScript中本身不支持类型反省外面TypeName
和VarType
的功能,它会给你一个对象的类型,但不会给你访问它的内部结构。
至于其他的答案解释也将提供此功能的DLL,但它不与Windows船,因为它是一个老版本的Visual Studio的一部分,可能没有时下获得它一个合法的方式。
虽然这部分是真实的,它不完全....谷歌,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
使用TypeLib Information Objects
从tlbinf32.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
,可调用类型( Sub
或Function
),和参数名称和在功能的情况下返回类型。 在的情况下,该对象的类型名称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,感谢。 工作出细节,并编写代码是几个小时的工作,虽然;-)
如果你碰巧使用HP UFT或QTP然后按照下列步骤:
1)安装MS Visual Studio中的任何版本安装到你的笔记本电脑。 (不要担心牌,你将不会被运行VS)
2)重新启动计算机。
3)启动UFT或QTP,加载脚本和命中F11(或在任何一段代码是要检查对象附近暂停)。
4)对象添加到监视窗口。 它可以是一个对象库对象或方案说明。
如果对象存在,对象现在会显示两个加号(+)在监视窗口迹象表明,可以扩展到显示所有可用的方法和属性,以及子对象是可以扩大。
使用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
试试这个 ...
For i = 0 To webElementCount-1 Step 1
innertextProp = myValue2(i).GetROProperty("innertext")
print i & innertextProp
print innertextProp
Next