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?
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. .
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
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 ;-)
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.
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
Essaye ça ...
For i = 0 To webElementCount-1 Step 1
innertextProp = myValue2(i).GetROProperty("innertext")
print i & innertextProp
print innertextProp
Next