Reflection 列出对象方法和属性

Reflection 列出对象方法和属性,reflection,vbscript,Reflection,Vbscript,有没有办法列出VBS中创建对象的可用方法 例如: Set IE = CreateObject("InternetExplorer.Application") 我想列出此对象的可用属性,如下所示: IE.AddressBar IE.Application IE.Busy ... 或方法: IE.ClientToWindow IE.ExecWB IE.GetProperty ... 如何在VBS中发现任意有效对象的可用属性?VBScript本身不支持和函数之外的类型自省,这将为您提供对象的类型

有没有办法列出VBS中创建对象的可用方法

例如:

Set IE = CreateObject("InternetExplorer.Application")
我想列出此对象的可用属性,如下所示:

IE.AddressBar
IE.Application
IE.Busy
...
或方法:

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

如何在VBS中发现任意有效对象的可用属性?

VBScript本身不支持和函数之外的类型自省,这将为您提供对象的类型,但不允许您访问其内部结构


正如其他答案所解释的,有一个DLL可以提供此功能,但它不随Windows提供,而且由于它是旧版Visual Studio的一部分,因此现在可能没有合法的方式获取它。

虽然这部分是正确的,但它不完整。。。。Google、GetObjectText、方法和属性_

引用的方法仅适用于通过WbemScripting.SWbemLocator对象连接到远程主机的cimv2命名空间时收集的对象。如果这个对象能够在本地主机上工作,我就看不到它

完成此操作后,您可以查询其中包含的任何类[Win32_服务、Win32_驱动器等],并使用对象上的For Next循环查询结果集中的对象,如下所示

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 oProp in oObject.Properties_
   'This will display all of an objects properties
   oProp.GetObjectText_
Next

如果您碰巧正在使用HP UFT或QTP,请执行以下步骤:

1) 在笔记本电脑上安装任何版本的MS Visual Studio。(不用担心许可问题,您不会运行VS)

2) 重新启动计算机

3) 启动UFT或QTP,加载脚本并点击F11(或在您要检查的对象附近的任何代码处暂停)

4) 将对象添加到“监视”窗口。它可以是对象存储库对象或编程描述

如果该对象存在,则该对象现在将在监视窗口中显示两个加号(+),可以展开该加号以显示所有可用的方法和属性,以及可以展开的子对象。

试试这个

For i = 0 To webElementCount-1 Step 1

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

Next

使用TLI。
TLI.tliaApplication
类(来自
tlbinf32.dll
)可以从实例中检查各种COM对象。在Excel或其他支持脚本的Microsoft产品中浏览TLI库,并使用脚本编辑器添加引用,然后添加
tlbinf32.dll
。引用中的名称是“Typelib信息”

但是请注意,DLL不随Windows提供

对VBScript类使用方法
interface info fromObject()
,或者尝试
classinfo fromObject()


使用
tlbinf32.dll
中的
TypeLib信息对象
,可以列出类的所有成员

`tlbinf32.dll`是*VisualStudio6.0*的一部分,这是2000年前后的最新版本。微软似乎不再提供DLL供下载(2017年年中的情况),但你可以从互联网上的各个网站下载它。我发现版本*1.1.88.4,版本8804,版权所有,微软1997-2000,大小148.480字节*https://www.dll4free.com/tlbinf32.dll.html,或其他网站。 要在Win32中安装DLL,请将其复制到“%windir%\System32”,并*作为管理员*从该目录调用“regsvr32.exe tlbinf32.DLL”。 要在Win64中安装DLL,请将其复制到“%windir%\syswow64”,然后*以管理员身份*注册到“%windir%\syswow64\regsvr32.exe”,最后使用“%windir%\syswow64\cscript.exe”(或“wscript.exe”)运行vbscript。感谢[BuvinJ](/users/3220983/BuvinJ)的[hint](/questions/14305750/list object methods and properties/44459670?noredirect=1 35; comment86169321 _44459670) 下面的脚本演示了包含的函数
VariableInfo
,该函数将返回一个带有所传递变量类型的字符串,如果是对象,则返回包含详细信息的所有成员,包括
属性的类型
、可调用类型(
Sub
function
),以及函数的参数名和返回类型。在
COM
对象的情况下,对象的类型名称将是实现的接口的名称。不确定它是否适用于多个实现的接口,但无论如何,通过
COM
在一个类中实现多个接口是不可能的

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

将在VBS中为您提供几乎完整的工作反射。非常适合探索API,例如使用Microsoft脚本调试器

通过tlbinfo32.dll反射VBScript ' 帕特里克·斯特拉瑟·米哈伊尔2017-2021 “Ansgar Wiechers 2019 ' https://stackoverflow.com/questions/14305750/list-object-methods-and-properties/44459670#44459670 ' 'v1.1 2021-02-01:显示数组和对象的值,但仅显示一个级别 '返回一个字符串,该字符串描述在第一级传递的对象/变量, “没有递归。 函数变量信息(obj) VariableInfo=VariableInfoToLevel(obj,0,1) 端函数 '返回一个字符串,该字符串描述在第一级传递的对象/变量, '递归到最高级别(0=无递归)。 函数变量InfoToLevel(对象、级别、最大级别) Const invokeKindPropertyGet=0'简单数据成员 Const invokeKindFunction=1'方法:子或函数 Const invokeKindPropertyPut=2'文档:具有值设置器;现实:更像是可设置的 Const invokeKindPropertyPutRef=4'文档:具有引用设置器;现实:更像是不可设置的 如果液位>最大液位,则 VariableInfoToLevel=“” 退出功能 如果结束 尺寸缩进:缩进=空间(4*级) VariableInfoToLevel=缩进 如果是空的(obj)或_ isNull(obj)_ 然后 VariableInfoToLevel=VariableInfoToLevel&TypeNameFromVarType(VarType(obj)) 如果不是IsObject(obj),则 如果不是isArray(obj),则 VariableInfoToLevel=indent&TypeNameFromVarType(VarType(obj))&“,值:[”&
For i = 0 To webElementCount-1 Step 1

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

Next
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