webentwicklung-frage-antwort-db.com.de

Listen Sie Objektmethoden und Eigenschaften auf

Gibt es eine Möglichkeit, verfügbare Methoden für ein erstelltes Objekt in VBS aufzulisten?

Zum Beispiel:

Set IE = CreateObject("InternetExplorer.Application")

Ich möchte verfügbare Eigenschaften dieses Objekts auflisten als:

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

oder Methoden:

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

Wie kann ich verfügbare Eigenschaften für ein beliebiges gültiges Objekt in VBS ermitteln?

20
theta

VBScript selbst unterstützt keine Typüberprüfung außerhalb der Funktionen TypeName und VarType , wodurch Sie den Typ eines Objekts erhalten, jedoch keinen Zugriff auf die interne Struktur.

Wie in den anderen Antworten erläutert, gibt es eine DLL, die diese Funktion bereitstellt, aber nicht mit Windows geliefert wird. Da sie Teil einer alten Version von Visual Studio war, gibt es heutzutage keinen legalen Weg, sie zu erhalten .

11
Ansgar Wiechers

Das ist zwar teilweise wahr, aber unvollständig .... Google, GetObjectText_, Methods_ & Propeties_

Die referenzierten Methoden funktionieren nur für Objekte, die erfasst wurden, während sie über das WbemScripting.SWbemLocator-Objekt mit dem cimv2-Namespace eines fernen Hosts verbunden sind. Wenn dieses Objekt mit localhost arbeiten kann, ist es für mich nicht nachvollziehbar.

Wenn Sie dies getan haben, können Sie eine der darin enthaltenen Klassen abfragen (Win32_Services, Win32_Drives usw.) und die Objekte im Resultset mithilfe einer For-Next-Schleife für das Objekt wie folgt abfragen.

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

Oder...

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

Endlich, ...

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

Mit TypeLib Information Objects aus tlbinf32.dll können Sie alle Mitglieder einer Klasse auflisten.

tlbinf32.dll war Teil von Visual Studio 6.0, der aktuellen Version in den Jahren um 2000. Microsoft scheint die DLL nicht mehr zum Download anzubieten (Situation Mitte 2017), Sie können jedoch herunterladen es von verschiedenen Seiten im Internet. Ich habe Version 1.1.88.4, Build 8804, Copyright Matthew Curland 1996, Microsoft 1997-2000, Größe 148.480 Bytes unter https://www.dll4free.com/tlbinf32.dll.html oder anderen gefunden Websites .

Um die DLL in Win32 zu installieren, kopieren Sie sie in %windir%\System32 und , wenn der Administratorregsvr32.exe tlbinf32.dll aus diesem Verzeichnis aufruft .

Um die DLL in Win64 zu installieren, kopieren Sie sie in %windir%\syswow64, dann als Administrator, registrieren Sie sich mit %windir%\syswow64\regsvr32.exe und führen Sie das Vbscript schließlich mit %windir%\syswow64\cscript.exe (oder wscript.exe) aus. Danke BuvinJ für den Hinweis

Das folgende Skript demonstriert die enthaltene Funktion VariableInfo, die eine Zeichenfolge mit dem Typ der übergebenen Variablen und im Fall eines Objekts alle Mitglieder mit Details zurückgibt, einschließlich des Typs Property, des aufrufbaren Typs (Sub oder Function) sowie der Parameternamen und Rückgabewert bei Funktion. Der Typname des Objekts im Fall eines COM-Objekts wäre der Name der implementierten Schnittstelle. Nicht sicher, ob es für mehrere implementierte Schnittstellen funktioniert, aber AFAIK ist es ohnehin nicht möglich, mehrere Schnittstellen in einer Klasse über COM zu implementieren.

Rekursion wird in keiner Weise unterstützt, da dies bei einigen Typen zu unendlich langen Schleifen führen würde.

Dieses gibt Ihnen praktisch voll funktionsfähige Reflektion in VBS. Ideal, um APIs beispielsweise mit dem Microsoft Script Debugger zu erkunden.

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") 
        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

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 Type " & 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

Weitere Informationen zur Typelib-Schnittstelle erhalten Sie in der Dokumentationshilfedatei unter Microsoft KB-Artikel 224331 .

Matthew Curland bietet zum Download auf der Website zu seinem Buch Advanced Visual Basic 6 das Nice-Programm Type Library Editor (EditTLBEval.exe) als Evaluierungsversion und die entsprechende Dokumentation

Besonders in diesem Zusammenhang gefällt mir die Zeile sehr: Wenn Sie ein Visual Basic-Entwickler sind, der die allgemein akzeptierten Einschränkungen von VB nicht erkennt, ist dieses Buch definitiv für Sie. von Ted Pattison. Ersetzen Sie einfach VB hier durch VBScript.

VBWebProfi gab den Hinweis für TLI, danke dafür. Das Ausarbeiten der Details und das Schreiben des Codes waren jedoch mehrere Stunden Arbeit ;-)

7
trapicki

Wenn Sie HP UFT oder QTP verwenden, gehen Sie folgendermaßen vor:

1) Installieren Sie eine beliebige Version von MS Visual Studio auf Ihrem Laptop. (Machen Sie sich keine Sorgen über die Lizenzierung, VS wird nicht ausgeführt)

2) Starten Sie Ihren Computer neu.

3) Starten Sie UFT oder QTP, laden Sie ein Skript und drücken Sie F11 (oder halten Sie an einem Code an, der sich in der Nähe des Objekts befindet, das Sie untersuchen möchten).

4) Fügen Sie das Objekt zum Überwachungsfenster hinzu. Es kann ein Object Repository-Objekt oder eine programmatische Beschreibung sein.

Wenn das Objekt vorhanden ist, zeigt das Objekt jetzt zwei Pluszeichen (+) im Überwachungsfenster an, die erweitert werden können, um alle verfügbaren Methoden und Eigenschaften sowie untergeordnete Objekte anzuzeigen, die erweitert werden können.

1
Paul Grossman

Verwenden Sie TLI. Die TLI.TLIApplication-Klasse (von tlbinf32.dll) kann verschiedene COM-Objekte von ihrer Instanz aus untersuchen. Durchsuchen Sie die TLI-Bibliothek in Excel oder einem anderen Microsoft-Produkt, das Skripts unterstützt und über einen Skripteditor verfügt, der Referenzen hinzufügen kann. Fügen Sie dann tlbinf32.dll hinzu. Der Name in den Referenzen lautet "Typelib-Informationen".

Beachten Sie, dass die DLL nicht mit Windows ausgeliefert wird.

Verwenden Sie die Methode InterfaceInfoFromObject() für VBScript-Klassen und versuchen Sie alternativ 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
1
VBWebProfi

Versuche dies ...

For i = 0 To webElementCount-1 Step 1

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

Next
0
Rey Mariano