web-dev-qa-db-fra.com

Liste des méthodes d'objet et des propriétés

Est-il possible de lister les méthodes disponibles pour les objets créés dans VBS?

Par exemple:

Set IE = CreateObject("InternetExplorer.Application")

Je veux lister les propriétés disponibles de cet objet, en tant que:

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

ou méthodes:

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

Comment puis-je découvrir les propriétés disponibles sur un objet valide arbitraire dans VBS?

20
theta

VBScript lui-même ne prend pas en charge l'introspection de types en dehors des fonctions TypeName et VarType , ce qui vous donnera le type d'un objet, mais ne vous donnera pas accès à sa structure interne.

Comme d'autres réponses l'ont expliqué, il existe une DLL qui fournirait cette fonctionnalité, mais elle n'est pas livrée avec Windows. Et comme elle faisait partie d'une ancienne version de Visual Studio, il se peut qu'il n'existe pas de moyen légal de l'obtenir aujourd'hui. .

11
Ansgar Wiechers

Bien que cela soit partiellement vrai, c'est incomplet .... Google, GetObjectText_, Methods_, & Propeties_

Les méthodes référencées ne fonctionnent que sur les objets collectés lors de la connexion à l'espace de nom cimv2 d'un hôte distant via l'objet WbemScripting.SWbemLocator. Si cet objet a la capacité de travailler sur localhost, ce n'est pas apparent pour moi.

Ceci fait, vous pouvez interroger n'importe laquelle des classes qui y sont contenues [Win32_Services, Win32_Drives, etc.] et interroger les objets du jeu de résultats à l'aide d'une boucle For-Next sur l'objet comme ci-dessous ...

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

Ou...

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

Finalement, ...

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

En utilisant TypeLib Information Objects à partir de tlbinf32.dll, il est possible de répertorier tous les membres d'une classe.

tlbinf32.dll faisait partie de Visual Studio 6.0, qui était la version actuelle dans les années 2000 environ. Microsoft ne semble plus offrir la DLL au téléchargement (situation mi-2017), mais vous pouvez le télécharger à partir de divers sites sur Internet. J'ai trouvé la version 1.1.88.4, version 8804, Copyright Matthew Curland 1996, Microsoft 1997-2000, taille 148,480 octets à l'adresse suivante: https://www.dll/flashf32.dll.html , ou d'autres sites .

Pour installer la DLL dans Win32, copiez-la dans %windir%\System32 et en tant qu'administrateur appelez regsvr32.exe tlbinf32.dll à partir de ce répertoire .

Pour installer la DLL dans Win64, copiez-la dans %windir%\syswow64, puis en tant qu'administrateur inscrivez-vous avec %windir%\syswow64\regsvr32.exe et exécutez enfin le vbscript avec %windir%\syswow64\cscript.exe (ou wscript.exe). Merci BuvinJ pour le indice

Le script suivant illustre la fonction incluse VariableInfo qui renvoie une chaîne avec le type de la variable transmise et, dans le cas d’un objet, tous les membres avec des détails, y compris le type de Property, le type appelable (Sub ou Function) et les noms de paramètre et type de retour en cas de fonction. Le nom de type de l'objet dans le cas d'un objet COM serait le nom de l'interface implémentée. Vous ne savez pas si cela fonctionne pour plusieurs interfaces implémentées, mais AFAIK, il est impossible d'implémenter plusieurs interfaces dans une classe via COM de toute façon.

Il ne prend en charge en aucune manière la récursivité, car cela entraînerait des boucles à l'infini pour certains types.

Ceci vous donnera un travail pratiquement complet réflexion dans VBS. Idéal pour explorer les API, par exemple avec le Débogueur de scripts Microsoft.

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

Pour plus d'informations sur Typelib Interface, obtenez le fichier d'aide sur la documentation auprès de Microsoft KB artivle 224331

Matthew Curland propose de télécharger son livre sur le site Web Advanced Visual Basic 6 le programme de Nice Editeur de bibliothèques de types (EditTLBEval.exe) en tant que version d'évaluation et les Documentation

Surtout dans ce contexte, j’aime beaucoup la ligne Si vous êtes un développeur Visual Basic qui refuse de reconnaître les limitations communément admises de VB, ce livre est tout à fait pour vous. De Ted Pattison. Il suffit de remplacer VB par VBScript ici.

VBWebProfi a donné l’allusion pour TLI, merci pour cela. Travailler sur les détails et écrire le code a demandé plusieurs heures de travail ;-)

7
trapicki

Si vous utilisez HP UFT ou QTP, procédez comme suit:

1) Installez n’importe quelle version de MS Visual Studio sur votre ordinateur portable. (Ne vous inquiétez pas pour les licences, vous n'utiliserez pas de VS)

2) Redémarrez votre ordinateur.

3) Lancez UFT ou QTP, chargez un script et appuyez sur F11 (ou mettez en pause tout élément de code situé à proximité de l'objet à inspecter).

4) Ajoutez l'objet à la fenêtre de surveillance. Il peut s'agir d'un objet Object Repository ou d'une description par programme.

Si l'objet existe, il affichera désormais deux signes Plus (+) dans la fenêtre de surveillance pouvant être développés pour afficher toutes les méthodes et propriétés disponibles, ainsi que des objets enfants pouvant être développés.

1
Paul Grossman

Utilisez TLI. La classe TLI.TLIApplication (à partir de tlbinf32.dll) peut inspecter divers objets COM à partir de leur instance. Explorez la bibliothèque TLI dans Excel ou un autre produit Microsoft prenant en charge les scripts et disposant d'un éditeur de script pouvant ajouter des références, puis ajoutez tlbinf32.dll. Le nom dans les références est "Information Typelib".

Notez que la DLL n'est pas livrée avec Windows, cependant.

Utilisez la méthode InterfaceInfoFromObject() pour les classes VBScript et essayez également 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

Essaye ça ...

For i = 0 To webElementCount-1 Step 1

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

Next
0
Rey Mariano