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 ;-)
możesz to zrobić za pomocą PowerShell: http://stackoverflow.com/a/25410064/240564 – Alexan