2013-01-13 17 views
16

Czy istnieje sposób na wyświetlenie dostępnych metod dla utworzonego obiektu w VBS?Metody i właściwości obiektów listy

Na przykład:

Set IE = CreateObject("InternetExplorer.Application") 

chcę do listy dostępnych właściwości tego obiektu, jak:

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

lub metod:

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

Jak mogę wyszukać dostępne właściwości do dowolny prawidłowy obiekt w VBS?

+3

możesz to zrobić za pomocą PowerShell: http://stackoverflow.com/a/25410064/240564 – Alexan

Odpowiedz

11

Nie możesz. VBScript nie obsługuje introspekcji typów.

+4

Następnie jak Vbsedit, Primalscript itp. wyświetlić automatyczną przeglądarkę obiektów według utworzonego obiektu w bieżącym skrypcie? – theta

+0

Najprawdopodobniej jest to funkcja zapewniona przez odpowiedniego redaktora. Nie jest dostarczany przez język lub interpreter skryptów. –

8

Mimo, że jest częściowo prawdziwa, jej niepełny .... Google GetObjectText_, Methods_, & Propeties_

powoływane metody będzie działać tylko na obiektach zebranych podczas połączenia z nazw cimv2 zdalnego hosta poprzez WbemScripting Obiekt .SWbemLocator. Jeśli ten obiekt ma zdolność do pracy na localhost, jest dla mnie nieprzyjemny.

Po wykonaniu tej czynności można wyszukać dowolny z zajęć prowadzonych w nim [Win32_Services, Win32_Drives, etc] i przesłuchać obiektów w zestawie wyników za pomocą pętli For-Next na obiekcie jak poniżej ...

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 

Albo ...

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

Wreszcie ...

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

Nie rozumiem ... jak zainicjowałeś 'oObject', aby móc używać dostarczonych pętli? – theta

+4

Tylko obiekty [WMI] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394582.aspx) obsługują to. – Helen

1

Jeśli zdarzy ci się być u śpiewać HP UFT lub QTP, a następnie wykonaj następujące kroki:

1) Zainstaluj dowolną wersję MS Visual Studio na swoim laptopie. (Nie martw się o licencjonowanie, nie będziesz używać VS)

2) Uruchom ponownie komputer.

3) Uruchom UFT lub QTP, wczytaj skrypt i naciśnij klawisz F11 (lub zatrzymaj dowolny fragment kodu znajdujący się w pobliżu obiektu, który chcesz sprawdzić).

4) Dodaj obiekt do okna Watch. Może to być obiekt repozytorium obiektów lub programowy opis.

Jeśli obiekt istnieje, obiekt wyświetli teraz dwie znaki Plus (+) w oknie obserwacyjnym, które można rozwinąć, aby pokazać wszystkie dostępne metody i właściwości, a także obiekty podrzędne, które można rozwinąć.

0

Spróbuj tego ...

For i = 0 To webElementCount-1 Step 1 

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

Next 
+1

Zamiast pisać "Wypróbuj to" byłoby świetnie, gdybyś mógł podsumować ideę swojego rozwiązania w pierwszym zdaniu. Odpowiedzi, które nie tylko zawierają kod, ale także pewne wyjaśnienia, zwykle zdobywają więcej głosów. – honk

0

Zastosowanie TLI ("TLI.TLIApplication").

+0

Nie wiem, dlaczego mój post został upuszczony na "-1", wydaje się, że osoba nigdy nie miała doświadczenia z klasą TLI.TLIApplication firmy Microsoft?Ta klasa może sprawdzać różne obiekty COM z ich instancji. Przeglądaj bibliotekę TLI w programie Excel lub innym produkcie Microsoft obsługującym skrypty i edytor skryptów, który może dodawać odwołania - dodaj plik Tlbinf32.dll. – VBWebProfi

+0

Nazwa pliku Tlbinf32.dll w referencjach to "Informacje o typelib". – VBWebProfi

+0

Użyj metody InterfaceInfoFromObject() dla klas VBScript i na przemian wypróbuj ClassInfoFromObject() z obiektu TLIApplication. Option Explicit Dim TLI Dim MyObject Dim TypeInfo Dim MemberInfo Set TLI = CreateObject ("TLI.TLIApplication") Set MyObject = Nowa MojaKlasa Set TypeInfo = TLI.InterfaceInfoFromObject (MyObject) For Each MemberInfo W TypeInfo.Members WScript.Echo MemberInfo.Name Następny klasy MojaKlasa \t Dim Nazwa_ \t Public Property Get Nazwa \t \t Name = Nazwa_ \t End Property Nazwa \t Public Property Let (ByVal Value) \t \t Nazwa_ = Wartość \t End Property Koniec Class' – VBWebProfi

2

Za pomocą TypeLib Information Objects z tlbinf32.dll1 można wyświetlić listę wszystkich członków klasy.

tlbinf32.dll był częścią Visual Studio 6.0, który był obecny uwolnienie w latach około 2000 roku Microsoft wydaje się nie oferują już DLL do pobrania (sytuacja w połowie 2017), ale można go pobrać z różnych witryny w Internecie. Znalazłem wersję 1.1.88.4, kompilację 8804, prawa autorskie Matthew Curland 1996, Microsoft 1997-2000, rozmiar 148,480 bajtów pod adresem https://www.dll-files.com/tlbinf32.dll.html lub inne witryny. Aby zainstalować DLL, skopiuj go do C:\Windows\System32 i zadzwoń pod numer regsvr32.exe tlbinf32.dll z tego katalogu.

Poniższy skrypt demonstruje zawarte funkcja VariableInfo która zwróci łańcuch z typem zmiennej minął, a w przypadku obiektu, wszystkie elementy ze szczegółami, w tym typu Property, na żądanie typu (Sub lub Function) oraz nazwy parametrów i typ zwracany w przypadku funkcji. Nazwa typu obiektu w przypadku obiektu COM byłaby nazwą zaimplementowanego interfejsu. Nie wiem, czy to działa dla wielu implementowanych interfejsów, ale AFAIK i tak nie jest możliwe zaimplementowanie wielu interfejsów w jednej klasie przez COM.

Nie obsługuje rekurencji w żaden sposób, ponieważ w niektórych przypadkach prowadzi to do pętli nieskończoności.

Ten da Ci praktycznie pełne pracy odbicie w VBS. Świetne do eksplorowania interfejsów API, na przykład z Microsoft Script Debugger.

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 

Aby uzyskać więcej informacji na temat TypeLib interfejsu, pobrać plik dokumentacji pomocy od Microsoft KB artivle 224331

Matthew Curland oferuje do pobrania na stronie internetowej swojej książki Advanced Visual Basic 6 miła programu Type Library Editor (EditTLBEval.exe) jako wersję próbną, a Zastosowanie według Documentation

Szczególnie w tym kontekście bardzo podoba mi się linii Jeśli jesteś deweloperem Visual Basic, który refus es rozpoznać powszechnie akceptowane ograniczenia VB, ta książka jest zdecydowanie dla Ciebie. autorstwa Teda Pattisona. Po prostu zastąp VB przez VBScript tutaj.

VBWebProfi gave the hint dla TLI, dziękuję za to. Opracowanie szczegółów i napisanie kodu to jednak kilka godzin pracy ;-)

+0

byłoby miło, aby zastąpić niektóre tych brzydkich opisów spraw z Scripting.Dictionary jednak. – Dmitry

Powiązane problemy