使用TypeLib Information组件TLBINF32.DLLPrivate Sub Command1_Click() iterateMembers Text1 End Sub Sub iterateMembers(obj As Object) Dim TLI As New TLIApplication, ret As Variant Dim interface As InterfaceInfo Dim member As MemberInfo On Error Resume Next Set interface = TLI.InterfaceInfoFromObject(obj)'=====>关键 Dim index As Long, tempstr As String ReDim str(interface.Members.Count) As String index = 0 For Each member In interface.Members tempstr = "" tempstr = tempstr & member.Name & vbTab & member.VTableOffset & vbTab & Hex$(member.MemberId) & _ vbTab & member.HelpString 'get property value; using memberID is faster than member.Name ret = TLI.InvokeHook(Text1, member.MemberId, INVOKE_PROPERTYGET) 'adjust long values; convert to hex (else shows neg value) If TypeName(ret) = "Long" Then ret = "&H" & Hex(ret) & "&" tempstr = tempstr & vbTab & ret & vbTab & "long" Else tempstr = tempstr & vbTab & ret & vbTab & TypeName(ret) End If 'store row data in array str(index) = tempstr index = index + 1 Next Set TLI = Nothing fillGrid str() End Sub Sub fillGrid(str() As String) Dim x As Long 'grid routine-------------------------------------------- MSFlexGrid1.Visible = False Me.MSFlexGrid1.Clear MSFlexGrid1.Rows = 1 'interface.Members.Count '6 data items;Property;Vtable;memberID;Helpstring;Value;Type MSFlexGrid1.Cols = 6 MSFlexGrid1.ColWidth(3) = 3080 MSFlexGrid1.ColWidth(4) = 1200 'setup fixed columm headers Me.MSFlexGrid1.TextArray(0 * 4 + 0) = "Property" Me.MSFlexGrid1.TextArray(0 * 4 + 1) = "VtableOffset" Me.MSFlexGrid1.TextArray(0 * 4 + 2) = "MemberID" Me.MSFlexGrid1.TextArray(0 * 4 + 3) = "Help String" Me.MSFlexGrid1.TextArray(0 * 4 + 4) = "Value" Me.MSFlexGrid1.TextArray(0 * 4 + 5) = "Type" 'from fixed row add item '_Default is repeated twice; x ->x-1; minor wrinkle For x = 1 To UBound(str()) - 1 'interface.Members.Count - 1 MSFlexGrid1.AddItem str(x), x Next x MSFlexGrid1.Visible = TrueEnd Sub
打开 Object Browser 对象浏览器
iterateMembers Text1
End Sub
Sub iterateMembers(obj As Object)
Dim TLI As New TLIApplication, ret As Variant
Dim interface As InterfaceInfo
Dim member As MemberInfo On Error Resume Next
Set interface = TLI.InterfaceInfoFromObject(obj)'=====>关键
Dim index As Long, tempstr As String
ReDim str(interface.Members.Count) As String index = 0
For Each member In interface.Members
tempstr = ""
tempstr = tempstr & member.Name & vbTab & member.VTableOffset & vbTab & Hex$(member.MemberId) & _
vbTab & member.HelpString
'get property value; using memberID is faster than member.Name
ret = TLI.InvokeHook(Text1, member.MemberId, INVOKE_PROPERTYGET)
'adjust long values; convert to hex (else shows neg value)
If TypeName(ret) = "Long" Then
ret = "&H" & Hex(ret) & "&"
tempstr = tempstr & vbTab & ret & vbTab & "long"
Else
tempstr = tempstr & vbTab & ret & vbTab & TypeName(ret)
End If
'store row data in array
str(index) = tempstr
index = index + 1 Next Set TLI = Nothing
fillGrid str()
End Sub
Sub fillGrid(str() As String)
Dim x As Long
'grid routine--------------------------------------------
MSFlexGrid1.Visible = False
Me.MSFlexGrid1.Clear
MSFlexGrid1.Rows = 1 'interface.Members.Count
'6 data items;Property;Vtable;memberID;Helpstring;Value;Type
MSFlexGrid1.Cols = 6
MSFlexGrid1.ColWidth(3) = 3080
MSFlexGrid1.ColWidth(4) = 1200
'setup fixed columm headers
Me.MSFlexGrid1.TextArray(0 * 4 + 0) = "Property"
Me.MSFlexGrid1.TextArray(0 * 4 + 1) = "VtableOffset"
Me.MSFlexGrid1.TextArray(0 * 4 + 2) = "MemberID"
Me.MSFlexGrid1.TextArray(0 * 4 + 3) = "Help String"
Me.MSFlexGrid1.TextArray(0 * 4 + 4) = "Value"
Me.MSFlexGrid1.TextArray(0 * 4 + 5) = "Type"
'from fixed row add item
'_Default is repeated twice; x ->x-1; minor wrinkle
For x = 1 To UBound(str()) - 1 'interface.Members.Count - 1
MSFlexGrid1.AddItem str(x), x
Next x
MSFlexGrid1.Visible = TrueEnd Sub