2013-01-13 70 views
16

有什麼辦法可以列出VBS中創建對象的可用方法嗎?列出對象的方法和屬性

例如:

Set IE = CreateObject("InternetExplorer.Application") 

我想列出此對象的可用屬性,如:

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

或方法:

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

我怎樣才能發現可用的屬性VBS中的任意有效對象?

+3

你可以做到這一點使用PowerShell的:http://stackoverflow.com/a/25410064/240564 – Alexan

回答

11

你不能。 VBScript不支持類型自省。

+4

那麼如何做Vbsedit將爲,Primalscript等。根據當前腳本中創建的對象顯示自動對象瀏覽器? – theta

+0

這很可能是相應編輯器提供的功能。它不是由語言或腳本解釋器提供的。 –

8

雖然這部分是真實的,它不完全....谷歌,GetObjectText_,Methods_,& Propeties_

引用的方法只能在收集,同時連接到通過WbemScripting遠程主機的cimv2命名空間對象的工作.SWbemLocator對象。如果這個對象有能力在本地主機上工作,這對我來說是不明顯的。

一旦你這樣做,你可以查詢任何所保持的類[Win32_Services,Win32_Drives等],並使用類似下面的物體上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 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 
+0

我不明白......你是如何啓動'oObject'才能夠使用你提供的循環? – theta

+4

只有[WMI](http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa394582.aspx)對象支持此功能。 – Helen

1

如果你剛好爲u唱HP UFT或QTP然後按照下列步驟:

1)安裝MS Visual Studio中的任何版本安裝到你的筆記本電腦。 (不要擔心牌,你將不會被運行VS)

2)重新啓動計算機。

3)啓動UFT或QTP,加載腳本和命中F11(或在任何一段代碼是要檢查對象附近暫停)。

4)對象添加到監視窗口。它可以是Object Repository對象或程序化描述。

如果對象存在,該對象將顯示兩個加號(+)在監視窗口跡象表明,可以擴展到顯示所有可用的方法和屬性,以及子對象是可以擴大。

0

嘗試......

For i = 0 To webElementCount-1 Step 1 

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

Next 
+1

而不是寫「嘗試這個」,如果你能在第一句中總結出你的解決方案的想法,那將是非常好的。不僅包含代碼的答案,而且一些解釋通常會得到更多的讚揚。 – honk

0

使用TLI( 「TLI.TLIApplication」)。

+0

不知道爲什麼我的帖子被降到「-1」似乎從來沒有與TLI.TLIApplication類的微軟經驗?這個類可以檢查他們實例中的各種COM對象。瀏覽Excel或支持腳本的其他Microsoft產品中的TLI庫,並具有可添加引用的腳本編輯器 - 添加Tlbinf32.dll。 – VBWebProfi

+0

引用中的Tlbinf32.dll的名稱是「Typelib信息」。 – VBWebProfi

+0

對VBScript類使用方法InterfaceInfoFromObject(),並交替嘗試從TLIApplication對象中獲取ClassInfoFromObject()。 Explicit選項 昏暗TLI 昏暗的MyObject 昏暗所屬類別 昏暗的MemberInfo 集TLI =的CreateObject( 「TLI.TLIApplication」) 設置爲MyObject =新MyClass的 集所屬類別= TLI.InterfaceInfoFromObject(爲MyObject) 對於每個的MemberInfo在TypeInfo.Members WScript.Echo MemberInfo.Name 接着 MyClass類 \t昏暗名_ \t公共屬性獲取名稱 \t \t名稱=名_ \t高端物業 \t公共財產令名稱(BYVAL值) \t \t名_ =價值 \t高端物業 結束Class' – VBWebProfi

2

使用TypeLib Information Objectstlbinf32.dll1它可以列出一類的所有成員。

tlbinf32.dll的Visual Studio 6.0,這是在2000年左右在歲月的當前版本的微軟似乎不提供下載的DLL了(情況2017年中期)的一部分,但你可以從不同的下載互聯網上的網站。我發現版本1.1.88.4,Build 8804,版權Matthew Curland 1996,Microsoft 1997-2000,大小148.480字節https://www.dll-files.com/tlbinf32.dll.html或其他站點。 要安裝該DLL,請將其複製到C:\Windows\System32,並從該目錄中調用regsvr32.exe tlbinf32.dll

下面的腳本演示所包括的功能VariableInfo這將返回一個字符串與傳遞的變量的類型,並且在一個對象的情況下,具有信息的所有成員,包括類型的Property,可調用類型(SubFunction ),以及Function中的參數名稱和返回類型。在COM對象的情況下,對象的類型名稱將是實現的接口的名稱。不知道它是否適用於多個實現的接口,但AFAIK無法通過COM在一個類中實現多個接口。

它不支持任何方式的遞歸,因爲這會導致某些類型的無限循環。

This will give you almost full full working reflection in VBS。非常適合探索API,例如微軟腳本調試器

Option Explicit 

Function VariableInfo(obj) 
    Const invokeKindPropertyGet = 0 
    Const invokeKindFunction = 1 
    Const invokeKindPropertyPut = 2 
    Const invokeKindPropertyPutRef = 4 

    If Not IsObject(obj) Then 
     VariableInfo = TypeName(obj) & ", Value: " & obj 
    Else 
     Dim TLI 
     Dim MemberInfo 
     Dim TypeInfo 
     Set TLI = CreateObject("TLI.TLIApplication") 
     Set TypeInfo = TLI.InterfaceInfoFromObject(obj) 

     VariableInfo = "Object " & TypeName(obj) 

     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 

Function TypeNameFromVarType(typeNr) 
    Select Case typeNr 
     case 0 
      TypeNameFromVarType = "vbEmpty" 
     case 1 
      TypeNameFromVarType = "vbNull" 
     case 2 
      TypeNameFromVarType = "vbInteger" 
     case 3 
      TypeNameFromVarType = "vbLong" 
     case 4 
      TypeNameFromVarType = "vbSingle" 
     case 5 
      TypeNameFromVarType = "vbDouble" 
     case 6 
      TypeNameFromVarType = "vbCurrency" 
     case 7 
      TypeNameFromVarType = "vbDate" 
     case 8 
      TypeNameFromVarType = "vbString" 
     case 9 
      TypeNameFromVarType = "vbObject" 
     case 11 
      TypeNameFromVarType = "vbBoolean" 
     case 12 
      TypeNameFromVarType = "vbVariant" 
     case 14 
      TypeNameFromVarType = "vbDecimal" 
     case 17 
      TypeNameFromVarType = "vbByte" 
     case 24 
      TypeNameFromVarType = "(void)" 
     case Else 
      If typeNr > 8192 Then 
       TypeNameFromVarType = "vbArray(" & TypeNameFromVarType(typeNr - 8192) & ")" 
      Else 
       typeNameFromVarType = "Unknown(" & typeNr & ")" 
      End If 
    End Select 
End Function 


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

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 

,用於爲類型庫接口更多信息,從中獲取文檔的幫助文件Microsoft KB artivle 224331

馬修Curland在網站上提供了下載到他的書Advanced Visual Basic 6 nice程序Type Library Editor (EditTLBEval.exe)作爲評估版本,並根據Documentation

特別是在這種情況下,我真的很喜歡該行如果你是一個Visual Basic開發誰拒絕要認識到VB普遍接受的限制,本書絕對適合你。 Ted Pattison。這裏用VBScript替換VB。

VBWebProfi gave the hint對於TLI,謝謝。工作出細節,並編寫代碼是幾個小時的工作,雖然;-)

+0

將是不錯的替代一些那些討厭的病例陳述與Scripting.Dictionary雖然。 – Dmitry