使用TypeLib Information Objects
從tlbinf32.dll1
它可以列出一類的所有成員。
tlbinf32.dll
是的Visual Studio 6.0,這是在2000年左右在歲月的當前版本的微軟似乎不提供下載的DLL了(情況2017年中期)的一部分,但你可以從不同的下載互聯網上的網站。我發現版本1.1.88.4,Build 8804,版權Matthew Curland 1996,Microsoft 1997-2000,大小148.480字節在https://www.dll-files.com/tlbinf32.dll.html或其他站點。 要安裝該DLL,請將其複製到C:\Windows\System32
,並從該目錄中調用regsvr32.exe tlbinf32.dll
。
下面的腳本演示所包括的功能VariableInfo
這將返回一個字符串與傳遞的變量的類型,並且在一個對象的情況下,具有信息的所有成員,包括類型的Property
,可調用類型(Sub
或Function
),以及Function中的參數名稱和返回類型。在COM
對象的情況下,對象的類型名稱將是實現的接口的名稱。不知道它是否適用於多個實現的接口,但AFAIK無法通過COM
在一個類中實現多個接口。
它不支持任何方式的遞歸,因爲這會導致某些類型的無限循環。
This will give you almost full full working reflection in VBS。非常適合探索API,例如微軟腳本調試器。
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
,用於爲類型庫接口更多信息,從中獲取文檔的幫助文件Microsoft KB artivle 224331
馬修Curland在網站上提供了下載到他的書Advanced Visual Basic 6 nice程序Type Library Editor (EditTLBEval.exe)作爲評估版本,並根據Documentation
特別是在這種情況下,我真的很喜歡該行如果你是一個Visual Basic開發誰拒絕要認識到VB普遍接受的限制,本書絕對適合你。 Ted Pattison。這裏用VBScript替換VB。
VBWebProfi gave the hint對於TLI,謝謝。工作出細節,並編寫代碼是幾個小時的工作,雖然;-)
你可以做到這一點使用PowerShell的:http://stackoverflow.com/a/25410064/240564 – Alexan