Excel VBAでファイル解析(タイプ・ライブラリ編)

2024-01-06

目次

■タイプ・ライブラリの概要

タイプ・ライブラリは、COMオブジェクトのインターフェースに関する定義情報が格納されているライブラリで、Microsoftのサイト(COM、DCOM、タイプライブラリ)の項には以下のように記載されています。

  • コンポーネントオブジェクトモデル (COM) と分散コンポーネントオブジェクトモデル (DCOM) は、リモートプロシージャコール (RPC) を使用して、分散コンポーネントオブジェクトが相互に通信できるようにします。
  • (中略)
  • タイプライブラリ (.tlb) は、COM または DCOM オブジェクトのプロパティおよびメソッドに関する情報を、実行時に他のアプリケーションからアクセスできる形式で格納するバイナリファイルです。

Visual Basic Editor(VBE)に搭載されているオブジェクト・ブラウザは、タイプ・ライブラリを参照してインターフェース情報を表示していますので、タイプ・ライブラリを参照して同様の情報を表示するExcelツールを作成するというのが本稿のテーマです。

タイプ・ライブラリの格納場所

あるオブジェクトのインターフェースを確認したい時、以下の手順でタイプ・ライブラリの格納場所を調べることができます。

①調べたいオブジェクトのGUIDを把握する
Excelで以下のような簡単なプログラムを作成すると、(出力例)のような結果が得られます(ここではFile System Objectが入っている、Scripting Runtimeを表示しています)。

  1. Dim sht, Ref As Object
  2. Dim lcnt As Long
  3. Private Sub Sample1()
  4.     Set sht = ActiveSheet
  5.     lcnt = 0
  6.     For Each Ref In ActiveWorkbook.VBProject.References
  7.         lcnt = lcnt + 1
  8.         sht.Cells(lcnt, 1) = Ref.Name
  9.         sht.Cells(lcnt, 2) = Ref.Description
  10.         sht.Cells(lcnt, 3) = Ref.GUID
  11.     Next Ref
  12.     Set Ref = Nothing
  13. End Sub

(出力例)

Scripting Microsoft Scripting Runtime {420B2830-E718-11CF-893D-00A0C9054228}

②レジストリ・エディタでGUIDに対応するタイプ・ライブラリの情報を取得する
Scripting Runtimeのタイプ・ライブラリを知りたい場合、レジストリ・エディタで[HKEY_CLASSES_ROOT]-[TypeLib]-[{420B2830-E718-11CF-893D-00A0C9054228}]の中を見ると、タイプライブラリが格納されているファイルが「C:\Windows\System32\scrrun.dll」であることがわかります。

この例では「dll」ファイルの中にタイプ・ライブラリが格納されていますが、拡張子は「tlb」「ocx」「exe」と色々です。
いずれにしろファイル形式としてはEXEファイルなので、ファイルの中を解析して行けば情報を取得できるはずですが、わからないことが多過ぎて断念しました。

色々と悩んだ末にVisual Basic 6.0に付属していたTLI(TypeLib Information library)を使用したExcelツールを作成したところ、オブジェクト・ブラウザと同等の情報を取得できましたので、次項で詳細を説明します。

■TLI(TypeLib Information library)の概要

TLI(TypeLib Information library)は、タイプ・ライブラリの情報を取得することに特化したクラス・ライブラリです。
次項でTLIのクラス一覧と主なクラスのメソッドおよびプロパティを説明します。
⇒詳細はMicrosoftのサイト(「COM」や.NET版の「TLI」等)を参照して下さい。

TLIのクラス一覧

TLIで提供されているクラスを一覧にすると下表の通りとなっており、種類がたくさんあるので若干わかり難いですが、主要なクラス(CoClass)はTLIApplicationクラス、TypeLibInfoクラス、SearchHelperクラスの3つだけで、後は全てサブクラスとなっています。
サブクラスの大半は情報の種類別に用意された「~Info」クラスで、TypeLibInfoクラス以外はコレクションとセットで用意されています。

(TLIのクラス一覧)

クラス 説明
CoClasses Subset of TypeInfos collection
CoClassInfo Members are a subset of TypeInfo object members
ConstantInfo Members are a subset of TypeInfo object members
Constants Subset of TypeInfos collection
CustomData CustomData Object
CustomDataCollection CustomData Collection
CustomFilter Interface for modifying or splitting a SearchResults collection, use with Implements
CustomSort Interface for custom sorting of a SearchResults collection, use with Implements
DeclarationInfo Members are a subset of TypeInfo object members
Declarations Subset of TypeInfos collection
InterfaceInfo Members are a subset of TypeInfo object members
Interfaces Subset of TypeInfos collection
IntrinsicAliases Subset of TypeInfos collection
IntrinsicAliasInfo Members are a subset of TypeInfo object members
ListBoxNotification ListBoxNotification interface, use with Implements and Direct methods
MemberInfo MemberInfo object
Members Members Collection
ParameterInfo Parameter Information
Parameters Parameters Collection
RecordInfo Members are a subset of TypeInfo object members
Records Subset of TypeInfos collection
SearchHelper Helper object for GetMembersWithSubString and multiple TypeLibs
SearchItem Item in SearchResults collection
SearchResults SearchResults collection
TLIApplication TLIApplication object
TypeInfo TypeInfo Information
TypeInfos TypeInfos Collection
TypeLibInfo TypeLib information
UnionInfo Members are a subset of TypeInfo object members
Unions Subset of TypeInfos collection
VarTypeInfo VarType information for parameters and return types

TypeInfoクラスにはType(型)に関する情報を保有しており、TypeInfoクラスのサブクラスにCoClassInfoクラス、ConstantInfoクラス、DeclarationInfoクラス、InterfaceInfoクラス、IntrinsicAliasInfoクラス、RecordInfoクラス、UnionInfoクラスがあります。
さらに各クラスのサブクラスとして、明細情報を保有するMemberInfoクラスがあり、メンバーがパラメータ(引数)を持っている場合には、MemberInfoクラスのサブクラスとして、ParameterInfoクラスが存在します。
主なクラスの階層構造を示すと、下図のようになります。

TLIApplicationクラス
TypeLibInfoクラス
CoClassInfoクラス
InterfaceInfoクラス
MemberInfoクラス
ParameterInfoクラス
ConstantInfoクラス
MemberInfoクラス
InterfaceInfoクラス
MemberInfoクラス
ParameterInfoクラス
TypeInfoクラス
InterfaceInfoクラス
MemberInfoクラス
ParameterInfoクラス
MemberInfoクラス
ParameterInfoクラス

■TLIApplicationクラスの詳細

TLIApplicationクラスにはTLI全般に関する機能が集められており、提供されているメソッドとプロパティは下表の通りです。

(TLIApplicationクラスのメソッドとプロパティ)

ClassInfoFromObjectメソッド
説明 Create a TypeInfo object from any running COM object
定義 Function ClassInfoFromObject(Object As Unknown) As TypeInfo
InterfaceInfoFromObjectメソッド
説明 Create an InterfaceInfo object from a running IDispatch object
定義 Function InterfaceInfoFromObject(Object As Object) As InterfaceInfo
InvokeHookメソッド
説明 Hook to IDispatch::Invoke. ID is Name or MemberID (DispId). List arguments backwards. Supports ByRef.
定義 Function InvokeHook(Object As Object, NameOrID As Variant, InvokeKind As InvokeKinds, ReverseArgList() As Variant) As Variant
InvokeHookArrayメソッド
説明 Hook to IDispatch::Invoke. ID is Name or MemberID. Arguments in ReverseArgList must be listed backwards. ByRef args not supported.
定義 Function InvokeHookArray(Object As Object, NameOrID As Variant, InvokeKind As InvokeKinds, ReverseArgList() As Variant) As Variant
InvokeHookArraySubメソッド
説明 InvokeHookArray call with no return value.
定義 Sub InvokeHookArraySub(Object As Object, NameOrID As Variant, InvokeKind As InvokeKinds, ReverseArgList() As Variant)
InvokeHookSubメソッド
説明 InvokeHook call with no return value.
定義 Sub InvokeHookSub(Object As Object, NameOrID As Variant, InvokeKind As InvokeKinds, ReverseArgList() As Variant)
InvokeIDメソッド
説明 Hook to IDispatch::GetIDsOfNames. Retrieve MemberID (DispId) once to speed up multiple InvokeHook calls.
定義 Function InvokeID(Object As Object, Name As String) As Long
InvokeLCIDプロパティ
説明 Language Identifier to use in InvokeHook calls.
定義 Property InvokeLCID() As Long
ListBoxNotificationプロパティ
説明 Notification object for all Get*Direct methods. Use with Implements.
定義 Property ListBoxNotification() As ListBoxNotification
RecordFieldプロパティ
説明 Read and write fields of a VT_RECORD Variant
定義 Property RecordField(RecordVariant As Variant, FieldName As String) As Variant
ResolveAliasesプロパティ
説明 Automatically resolve all aliased parameters and return types. Defaults to True.
定義 Property ResolveAliases() As Boolean
TypeInfoFromRecordVariantメソッド
説明 Create a TypeInfo object from a VT_RECORD Variant
定義 Function TypeInfoFromRecordVariant(RecordVariant As Variant) As TypeInfo
TypeLibInfoFromFileメソッド
説明 Create a TypeLibInfo object from a file
定義 Function TypeLibInfoFromFile(FileName As String) As TypeLibInfo
TypeLibInfoFromRegistryメソッド
説明 Create a TypeLibInfo object from a file
定義 Function TypeLibInfoFromRegistry(TypeLibGuid As String, MajorVersion As Integer, MinorVersion As Integer, LCID As Long) As TypeLibInfo

■TypeLibInfoクラスの詳細

TypeLibInfoクラスにはタイプ・ライブラリに関する機能が集められており、提供されているメソッドとプロパティは下表の通りです。

(TypeLibInfoクラスのメソッド)

AddTypesメソッド
説明 Add types to a GetTypes* SearchResults object
定義 Function AddTypes(TypeInfoNumbers() As Integer, [StartResults As SearchResults = 0], [SearchType As TliSearchTypes = tliStDefault], [Sort As Boolean = True]) As SearchResults
AddTypesDirectメソッド
説明 Add types to a GetTypes* SearchResults object. Add directly to hWnd.
定義 Function AddTypesDirect(TypeInfoNumbers() As Integer, hWnd As Integer, [WindowType As TliWindowTypes = tliWtListBox], [SearchType As TliSearchTypes = tliStDefault]) As Integer
CaseMemberNameメソッド
説明 Check if this is a valid member name
定義 Function CaseMemberName(bstrName As String, [SearchType As TliSearchTypes = tliStDefault]) As Boolean
CaseTypeNameメソッド
説明 Try to case the name of a type which matches the search criteria. Returns matching search flags.
定義 Function CaseTypeName(bstrName As String, [SearchType As TliSearchTypes = tliStDefault]) As TliSearchTypes
FreeSearchCriteriaメソッド
説明 Free cached search information. (8 * TypeInfoCount bytes)
定義 Sub FreeSearchCriteria()
GetMemberInfoメソッド
説明 Create MemberInfo object from type and member searches.
定義 Function GetMemberInfo(SearchData As Long, [InvokeKinds As InvokeKinds = INVOKE_UNKNOWN], [MemberId As Long = -1], [MemberName As String]) As MemberInfo
GetMembersメソッド
説明 Get members corresponding to SearchData
定義 Function GetMembers(SearchData As Long, [ShowUnderscore As Boolean = False]) As SearchResults
GetMembersDirectメソッド
説明 Get members corresponding to SearchData. Add directly to hWnd.
定義 Function GetMembersDirect(SearchData As Long, hWnd As Integer, [WindowType As TliWindowTypes = tliWtListBox], [ItemDataType As TliItemDataTypes = tliIdtMemberID], [ShowUnderscore As Boolean = False]) As Integer
GetMembersWithSubStringメソッド
説明 Get matching member names
定義 Function GetMembersWithSubString(SubString As String, [StartResults As SearchResults = 0], [SearchType As TliSearchTypes = tliStDefault], [SearchMiddle As Boolean = True], [Helper As SearchHelper = 0], [Sort As Boolean = True], [ShowUnderscore As Boolean = False]) As SearchResults
GetMembersWithSubStringDirectメソッド
説明 Get matching member names. Add directly to hWnd.
定義 Function GetMembersWithSubStringDirect(SubString As String, hWnd As Integer, [WindowType As TliWindowTypes = tliWtListBox], [SearchType As TliSearchTypes = tliStDefault], [SearchMiddle As Boolean = True], [Helper As SearchHelper = 0], [ShowUnderscore As Boolean = False]) As Integer
GetMembersWithSubStringExメソッド
説明 Get matching member names grouped by InvokeKind.
定義 Function GetMembersWithSubStringEx(SubString As String, InvokeGroupings As Array, [StartResults As SearchResults = 0], [SearchType As TliSearchTypes = tliStDefault], [SearchMiddle As Boolean = True], [Sort As Boolean = True], [ShowUnderscore As Boolean = False]) As SearchResults
GetTypesメソッド
説明 Get types which match the give search criteria.
定義 Function GetTypes([StartResults As SearchResults = 0], [SearchType As TliSearchTypes = tliStDefault], [Sort As Boolean = True]) As SearchResults
GetTypesDirectメソッド
説明 Get types which match the give search criteria. Add directly to hWnd.
定義 Function GetTypesDirect(hWnd As Integer, [WindowType As TliWindowTypes = tliWtListBox], [SearchType As TliSearchTypes = tliStDefault]) As Integer
GetTypesWithMemberメソッド
説明 Get types with given member
定義 Function GetTypesWithMember(MemberName As String, [StartResults As SearchResults = 0], [SearchType As TliSearchTypes = tliStDefault], [Sort As Boolean = True], [ShowUnderscore As Boolean = False]) As SearchResults
GetTypesWithMemberDirectメソッド
説明 Get types with given member. Add directly to hWnd.
定義 Function GetTypesWithMemberDirect(MemberName As String, hWnd As Integer, [WindowType As TliWindowTypes = tliWtListBox], [SearchType As TliSearchTypes = tliStDefault], [ShowUnderscore As Boolean = False]) As Integer
GetTypesWithMemberExメソッド
説明 Get types with member, verify InvokeKinds
定義 Function GetTypesWithMemberEx(MemberName As String, InvokeKind As InvokeKinds, [StartResults As SearchResults = 0], [SearchType As TliSearchTypes = tliStDefault], [Sort As Boolean = True], [ShowUnderscore As Boolean = False]) As SearchResults
GetTypesWithSubStringメソッド
説明 Get matching type names.
定義 Function GetTypesWithSubString(SubString As String, [StartResults As SearchResults = 0], [SearchType As TliSearchTypes = tliStDefault], [SearchMiddle As Boolean = True], [Sort As Boolean = True]) As SearchResults
GetTypesWithSubStringDirectメソッド
説明 Get matching type names. Add directly to hWnd.
定義 Function GetTypesWithSubStringDirect(SubString As String, hWnd As Integer, [WindowType As TliWindowTypes = tliWtListBox], [SearchType As TliSearchTypes = tliStDefault], [SearchMiddle As Boolean = True]) As Integer
IsSameLibraryメソッド
説明 Is this the same TypeLib?
定義 Function IsSameLibrary(CheckLib As TypeLibInfo) As Boolean
LoadRegTypeLibメソッド
説明 Load a registered typelib
定義 Sub LoadRegTypeLib(TypeLibGuid As String, MajorVersion As Integer, MinorVersion As Integer, LCID As Long)
MakeSearchDataメソッド
説明 Generate SearchData for use with GetMembers[Direct]
定義 Function MakeSearchData(TypeInfoName As String, [SearchType As TliSearchTypes = tliStDefault]) As Long
Registerメソッド
説明 Register the typelib
定義 Sub Register([HelpDir As String])
ResetSearchCriteriaメソッド
説明 Resets search criteria. Only matching typeinfos will be searched.
定義 Sub ResetSearchCriteria([TypeFilter As TypeFlags = TYPEFLAG_DEFAULTFILTER], [IncludeEmptyTypes As Boolean = False], [ShowUnderscore As Boolean = False])
SetMemberFiltersメソッド
説明 Set filters for member searches (GetMembersWithSubstring[Direct], GetMembers[Direct])
定義 Sub SetMemberFilters([FuncFilter As FuncFlags = FUNCFLAG_DEFAULTFILTER], [VarFilter As VarFlags = VARFLAG_DEFAULTFILTER])
UnRegisterメソッド
説明 UnRegister the typelib
定義 Sub UnRegister()

(TypeLibInfoクラスのプロパティ)

AppObjStringプロパティ
説明 The string to put in the list for an application object entry
定義 Property AppObjString() As String
AppObjStringプロパティ(読み取り専用)
説明 The string to put in the list for an application object entry
定義 Property AppObjString() As String
AttributeMaskプロパティ(読み取り専用)
説明 Type attribute mask for the library
定義 Property AttributeMask() As Integer
AttributeStringsプロパティ(読み取り専用)
説明 Type attributes for the library
定義 Property AttributeStrings(AttributeArray() As String) As Integer
BestEquivalentTypeプロパティ(読み取り専用)
説明 Find a corresponding visible type
定義 Property BestEquivalentType(TypeInfoName As String) As String
CoClassesプロパティ(読み取り専用)
説明 The CoClasses for the current TypeLib
定義 Property CoClasses() As CoClasses
Constantsプロパティ(読み取り専用)
説明 The constants for the current TypeLib
定義 Property Constants() As Constants
ContainingFileプロパティ(読み取り専用)
説明 Name of file containing TypeLib
定義 Property ContainingFile() As String
ContainingFileプロパティ
説明 Name of file containing TypeLib
定義 Property ContainingFile() As String
CustomDataCollectionプロパティ(読み取り専用)
説明 Custom data GUIDs and Values
定義 Property CustomDataCollection() As CustomDataCollection
Declarationsプロパティ(読み取り専用)
説明 The declarations for the current TypeLib
定義 Property Declarations() As Declarations
GetTypeInfoプロパティ(読み取り専用)
説明 Get TypeInfo directly by Name or TypeInfoNumber
定義 Property GetTypeInfo(Index As Variant) As TypeInfo
GetTypeInfoNumberプロパティ(読み取り専用)
説明 Get interface number by name
定義 Property GetTypeInfoNumber(Name As String) As Integer
GetTypeKindプロパティ(読み取り専用)
説明 TypeKind of TypeInfo number
定義 Property GetTypeKind(TypeInfoNumber As Integer) As TypeKinds
GUIDプロパティ(読み取り専用)
説明 Registry format of TypeLib GUID
定義 Property GUID() As String
HelpContextプロパティ(読み取り専用)
説明 HelpContext for the library
定義 Property HelpContext() As Long
HelpFileプロパティ(読み取り専用)
説明 HelpFile for the library
定義 Property HelpFile() As String
HelpStringプロパティ(読み取り専用)
説明 Helpstring for the library
定義 Property HelpString([LCID As Long = 0]) As String
HelpStringContextプロパティ(読み取り専用)
説明 Context ID for use with DLLGetDocumentation
定義 Property HelpStringContext() As Long
HelpStringDllプロパティ(読み取り専用)
説明 Dll with DLLGetDocumentation entry point
定義 Property HelpStringDll([LCID As Long = 0]) As String
Interfacesプロパティ(読み取り専用)
説明 The interfaces for the current TypeLib
定義 Property Interfaces() As Interfaces
IntrinsicAliasesプロパティ(読み取り専用)
説明 The intrinsic aliases for the current TypeLib
定義 Property IntrinsicAliases() As IntrinsicAliases
LCIDプロパティ(読み取り専用)
説明 LCID of TypeLib
定義 Property LCID() As Long
LibNumプロパティ
説明 The external library number. Placed in ItemData when lists are filled.
定義 Property LibNum() As Integer
LibNumプロパティ(読み取り専用)
説明 The external library number. Placed in ItemData when lists are filled.
定義 Property LibNum() As Integer
MajorVersionプロパティ(読み取り専用)
説明 Major Version of TypeLib
定義 Property MajorVersion() As Integer
MinorVersionプロパティ(読み取り専用)
説明 Minor Version of TypeLib
定義 Property MinorVersion() As Integer
Nameプロパティ(既定)(読み取り専用)
説明 Name of the object
定義 Property Name() As String
Recordsプロパティ(読み取り専用)
説明 The records for the current TypeLib
定義 Property Records() As Records
SearchDefaultプロパティ
説明 Default search filter
定義 Property SearchDefault() As TliSearchTypes
ShowLibNameプロパティ
説明 Whether or not to display the library name.
定義 Property ShowLibName() As Boolean
SysKindプロパティ(読み取り専用)
説明 SysKind of TypeLib
定義 Property SysKind() As SysKinds
TypeInfoCountプロパティ(読み取り専用)
説明 Total TypeInfos in typelib
定義 Property TypeInfoCount() As Integer
TypeInfosプロパティ(読み取り専用)
説明 The TypeInfos for the current TypeLib
定義 Property TypeInfos() As TypeInfos
Unionsプロパティ(読み取り専用)
説明 The unions for the current TypeLib
定義 Property Unions() As Unions

■CoClassesコレクション、Constantsコレクション、Declarationsコレクション、Interfacesコレクション、 IntrinsicAliasesコレクション、Recordsコレクション、TypeInfosコレクション、Unionsコレクションの詳細

「~コレクション」は「~Infoクラス」の集合体で、提供されているプロパティは下表の通りです(メソッドはありません)。

なお、MembersコレクションとParametersコレクションは少しパターンが違うので、項を分けて説明します。

(~コレクションのプロパティ)

Countプロパティ(読み取り専用)
説明 Number of items in collection
定義 Property Count() As Integer
IndexedItemプロパティ(読み取り専用)
説明 Fetch by ~Info number
定義 Property IndexedItem(~InfoNumber As Integer) As ~Info
Itemプロパティ(既定)(読み取り専用)
説明 ~Info object
定義 Property Item(Index As Integer) As ~Info
NamedItemプロパティ(読み取り専用)
説明 Fetch by name
定義 Property NamedItem(~InfoName As String) As ~Info

■CoClassInfoクラス、ConstantInfoクラス、DeclarationInfoクラス、InterfaceInfoクラス、IntrinsicAliasInfoクラス、RecordInfoクラス、TypeInfoクラス、UnionInfoクラスの詳細

「~Infoクラス」で提供されているプロパティは下表の通りです(メソッドはありません)が、クラスによって若干の相違があるので、対応表を併せて掲載します。

なお、MemberInfoクラスとParameterInfoクラスは少しパターンが違うので、項を分けて説明します。

(~Infoクラスのプロパティ)

AttributeMaskプロパティ(読み取り専用)
説明 Type attribute mask for the ~Info
定義 Property AttributeMask() As Integer
AttributeStringsプロパティ(読み取り専用)
説明 Type attributes for the ~Info
定義 Property AttributeStrings(AttributeArray() As String) As Integer
CustomDataCollectionプロパティ(読み取り専用)
説明 Custom data GUIDs and Values
定義 Property CustomDataCollection() As CustomDataCollection
DefaultEventInterfaceプロパティ(読み取り専用)
説明 Information for Default Event Interface. CoClassInfo only.
定義 Property DefaultEventInterface() As InterfaceInfo
DefaultInterfaceプロパティ(読み取り専用)
説明 Information for Default Interface. CoClassInfo only.
定義 Property DefaultInterface() As InterfaceInfo
GetMemberプロパティ(読み取り専用)
説明 Member by name or MemID
定義 Property GetMember(Index As Variant) As MemberInfo
GUIDプロパティ(読み取り専用)
説明 Registry format of ~Info GUID
定義 Property GUID() As String
HelpContextプロパティ(読み取り専用)
説明 HelpContext for the ~Info
定義 Property HelpContext() As Long
HelpFileプロパティ(読み取り専用)
説明 HelpFile for the ~Info
定義 Property HelpFile() As String
HelpStringプロパティ(読み取り専用)
説明 Helpstring for the ~Info
定義 Property HelpString([LCID As Long = 0]) As String
HelpStringContextプロパティ(読み取り専用)
説明 Context ID for use with DLLGetDocumentation
定義 Property HelpStringContext() As Long
HelpStringDllプロパティ(読み取り専用)
説明 Dll with DLLGetDocumentation entry point
定義 Property HelpStringDll([LCID As Long = 0]) As String
ImpliedInterfacesプロパティ(読み取り専用)
説明 Interfaces collection
定義 Property ImpliedInterfaces() As Interfaces
Interfacesプロパティ(読み取り専用)
説明 Interfaces collection
定義 Property Interfaces() As Interfaces
MajorVersionプロパティ(読み取り専用)
説明 Major Version of ~Info
定義 Property MajorVersion() As Integer
Membersプロパティ(読み取り専用)
説明 Members collection
定義 Property Members() As Members
MinorVersionプロパティ(読み取り専用)
説明 Minor Version of ~Info
定義 Property MinorVersion() As Integer
Nameプロパティ(既定)(読み取り専用)
説明 Name of the object
定義 Property Name() As String
Parentプロパティ(読み取り専用)
説明 Containing TypeLibInfo object
定義 Property Parent() As TypeLibInfo
ResolvedTypeプロパティ(読み取り専用)
説明 Base type. Valid only if TypeKind is TKIND_ALIAS.
定義 Property ResolvedType() As Var~Info
~InfoNumberプロパティ(読み取り専用)
説明 Actual Index of ~Info in TypeLib
定義 Property ~InfoNumber() As Integer
TypeKindプロパティ(読み取り専用)
説明 TypeKind of the ~Info, numeric value
定義 Property TypeKind() As TypeKinds
TypeKindStringプロパティ(読み取り専用)
説明 TypeKind of the ~Info, string
定義 Property TypeKindString() As String
VTableInterfaceプロパティ(読み取り専用)
説明 VTable version of this interface
定義 Property VTableInterface() As InterfaceInfo

(~Infoクラスのプロパティ対応表)

CoClassInfoクラス ConstantInfoクラス DeclarationInfoクラス InterfaceInfoクラス IntrinsicAliasInfoクラス RecordInfoクラス TypeInfoクラス UnionInfoクラス
AttributeMaskプロパティ
AttributeStringsプロパティ
CustomDataCollectionプロパティ
DefaultEventInterfaceプロパティ × × × × × ×
DefaultInterfaceプロパティ × × × × × ×
GetMemberプロパティ × ×
GUIDプロパティ
HelpContextプロパティ
HelpFileプロパティ
HelpStringプロパティ
HelpStringContextプロパティ
HelpStringDllプロパティ
ImpliedInterfacesプロパティ × × × × × × ×
Interfacesプロパティ × × × × × ×
MajorVersionプロパティ
Membersプロパティ × ×
MinorVersionプロパティ
Nameプロパティ
Parentプロパティ
ResolvedTypeプロパティ
TypeInfoNumbeプロパティ
TypeKindプロパティ
TypeKindStringプロパティ
VTableInterfaceプロパティ × × × × × ×

■Membersコレクション、MemberInfoクラスの詳細

MembersコレクションとMemberInfoクラスで提供されているメソッドおよびプロパティは下表の通りです。

(Membersコレクションのメソッドとプロパティ)

Countプロパティ(読み取り専用)
説明 Number of items in collection
定義 Property Count() As Integer
FuncFilterプロパティ
説明 Method exclusion filter
定義 Property FuncFilter() As FuncFlags
GetFilteredMembersプロパティ(読み取り専用)
説明 Get members without named duplicates
定義 Property GetFilteredMembers([ShowUnderscore As Boolean]) As SearchResults
GetFilteredMembersDirectメソッド
説明 Get members without named duplicates (Clear and fill hWnd)
定義 Function GetFilteredMembersDirect(hWnd As Integer, [WindowType As TliWindowTypes], [ItemDataType As TliItemDataTypes], [ShowUnderscore As Boolean]) As Integer
Itemプロパティ(既定)(読み取り専用)
説明 MemberInfo object
定義 Property Item(Index As Integer) As MemberInfo
VarFilterプロパティ
説明 Property exclusion filter
定義 Property VarFilter() As VarFlags

(MemberInfoクラスのメソッドとプロパティ)

AttributeMaskプロパティ(読み取り専用)
説明 Type attribute mask for the member
定義 Property AttributeMask() As Integer
AttributeStringsプロパティ(読み取り専用)
説明 Type attributes for the member
定義 Property AttributeStrings(AttributeArray() As String) As Integer
CallConvプロパティ(読み取り専用)
説明 Calling convention of member
定義 Property CallConv() As CallConvs
CustomDataCollectionプロパティ(読み取り専用)
説明 Custom data GUIDs and Values
定義 Property CustomDataCollection() As CustomDataCollection
DescKindプロパティ(読み取り専用)
説明 DescKind of member.
定義 Property DescKind() As DescKinds
GetDllEntryメソッド
説明 Get Dll name and entry point.
定義 Sub GetDllEntry(DllName As String, EntryName As String, Ordinal As Integer)
HelpContextプロパティ(読み取り専用)
説明 HelpContext for the member
定義 Property HelpContext() As Long
HelpFileプロパティ(読み取り専用)
説明 HelpFile for the member
定義 Property HelpFile() As String
HelpStringプロパティ(読み取り専用)
説明 Helpstring for the member
定義 Property HelpString([LCID As Long]) As String
HelpStringContextプロパティ(読み取り専用)
説明 HelpStringContext for the member
定義 Property HelpStringContext() As Long
HelpStringDllプロパティ(読み取り専用)
説明 Dll with DLLGetDocumentation entry point
定義 Property HelpStringDll([LCID As Long]) As String
InvokeKindプロパティ(読み取り専用)
説明 InvokeKind of member
定義 Property InvokeKind() As InvokeKinds
MemberIdプロパティ(読み取り専用)
説明 MemberId (DispId) for member function or variable.
定義 Property MemberId() As Long
Nameプロパティ(既定)(読み取り専用)
説明 Name of the object
定義 Property Name() As String
Parametersプロパティ(読み取り専用)
説明 Parameters Collection
定義 Property Parameters() As Parameters
ReturnTypeプロパティ(読み取り専用)
説明 VarTypeInfo object for returned type
定義 Property ReturnType() As VarTypeInfo
Valueプロパティ(読み取り専用)
説明 Value of the member, ConstantInfo only
定義 Property Value() As Variant
VTableOffsetプロパティ(読み取り専用)
説明 VTable Offset of member. -1 if not available.
定義 Property VTableOffset() As Integer

■Parametersコレクション、ParameterInfoクラスの詳細

ParametersコレクションとParameterInfoクラスで提供されているプロパティは下表の通りです(メソッドはありません)。

(Parametersコレクションのプロパティ)

Countプロパティ(読み取り専用)
説明 Number of items in collection
定義 Property Count() As Integer
DefaultCountプロパティ(読み取り専用)
説明 Number of default parameters. Not included in optional count.
定義 Property DefaultCount() As Integer
Itemプロパティ(既定)(読み取り専用)
説明 ParameterInfo object
定義 Property Item(Index As Integer) As ParameterInfo
OptionalCountプロパティ(読み取り専用)
説明 Number of optional parameters
定義 Property OptionalCount() As Integer

(ParameterInfoクラスのプロパティ)

CustomDataCollectionプロパティ(読み取り専用)
説明 Custom data GUIDs and Values
定義 Property CustomDataCollection() As CustomDataCollection
Defaultプロパティ(読み取り専用)
説明 Default Parameter
定義 Property Default() As Boolean
DefaultValueプロパティ(読み取り専用)
説明 Default value
定義 Property DefaultValue() As Variant
Flagsプロパティ(読み取り専用)
説明 Parameter Flags
定義 Property Flags() As ParamFlags
HasCustomDataプロパティ(読み取り専用)
説明 Check if custom data is available
定義 Property HasCustomData() As Boolean
Nameプロパティ(既定)(読み取り専用)
説明 Name of the object
定義 Property Name() As String
Optionalプロパティ(読み取り専用)
説明 Optional Parameter
定義 Property Optional() As Boolean
VarTypeInfoプロパティ(読み取り専用)
説明 VarTypeInfo object for this parameter
定義 Property VarTypeInfo() As VarTypeInfo

■VarTypeInfoクラスの詳細

CoClassInfoクラス・ConstantInfoクラス・DeclarationInfoクラス・InterfaceInfoクラス・IntrinsicAliasInfoクラス・RecordInfoクラス・TypeInfoクラス・UnionInfoクラスのResolvedTypeプロパティ、MemberInfoクラスのReturnTypeプロパティ、ParameterInfoクラスのVarTypeInfoプロパティは、VarTypeInfoオブジェクト(クラス)を返します。

VarTypeInfoクラスで提供されているメソッドとプロパティは下表の通りで、標準的な「タイプ」についてはVarTypeプロパティでTliVarType列挙体で定義された値を返し、ユーザが定義した「タイプ」についてはTypeInfoNumberプロパティでTypeInfoクラスで定義された「タイプ」のインデックス番号を返します。

(VarTypeInfoクラスのメソッドとプロパティ)

ArrayBoundsメソッド
説明 Get bounds for VT_VECTOR array. LBound in column 1, UBound in column 2.
定義 Function ArrayBounds(Bounds() As Long) As Integer
ElementPointerLevelプロパティ(読み取り専用)
説明 Dereferencing level for type of an array element
定義 Property ElementPointerLevel() As Integer
IsExternalTypeプロパティ(読み取り専用)
説明 Is TypeInfo external to this library
定義 Property IsExternalType() As Boolean
PointerLevelプロパティ(読み取り専用)
説明 Dereferencing level of type
定義 Property PointerLevel() As Integer
TypedVariantプロパティ(読み取り専用)
説明 Get a variant with this VarType
定義 Property TypedVariant() As Variant
TypeInfoプロパティ(読み取り専用)
説明 Type information for VT_PTR VarType
定義 Property TypeInfo() As TypeInfo
TypeInfoNumberプロパティ(読み取り専用)
説明 TypeInfo number for 0 VarType (Cheaper than TypeInfo property)
定義 Property TypeInfoNumber() As Integer
TypeLibInfoExternalプロパティ(読み取り専用)
説明 External typelib. Same as TypeInfo.Parent.
定義 Property TypeLibInfoExternal() As TypeLibInfo
VarTypeプロパティ(既定)(読み取り専用)
説明 VarType of Parameter
定義 Property VarType() As TliVarType

■TLIで定義されている列挙体の詳細

TLIで定義されている列挙体は下表の通りです。

Name Value
CallConvs列挙体
OLE Automation CALLCONV values
CC_FASTCALL 0
CC_CDECL 1
CC_MSCPASCAL 2
CC_PASCAL 2
CC_MACPASCAL 3
CC_STDCALL 4
CC_FPFASTCALL 5
CC_SYSCALL 6
CC_MPWCDECL 7
CC_MPWPASCAL 8
CC_MAX 9
DescKinds列挙体
OLE Automation DESCKIND values
DESCKIND_NONE 0
DESCKIND_FUNCDESC 1
DESCKIND_VARDESC 2
FuncFlags列挙体
OLE Automation FUNCFLAG values
FUNCFLAG_NONE 0
FUNCFLAG_FRESTRICTED 1
FUNCFLAG_FSOURCE 2
FUNCFLAG_FBINDABLE 4
FUNCFLAG_FREQUESTEDIT 8
FUNCFLAG_FDISPLAYBIND 16
FUNCFLAG_FDEFAULTBIND 32
FUNCFLAG_FHIDDEN 64
FUNCFLAG_DEFAULTFILTER 65
FUNCFLAG_FUSESGETLASTERROR 128
FUNCFLAG_FDEFAULTCOLLELEM 256
FUNCFLAG_FUIDEFAULT 512
FUNCFLAG_FNONBROWSABLE 1024
FUNCFLAG_FREPLACEABLE 2048
FUNCFLAG_FIMMEDIATEBIND 4096
IDLFlags列挙体
OLE Automation IDLFLAG values
IDLFLAG_NONE 0
IDLFLAG_FIN 1
IDLFLAG_FOUT 2
IDLFLAG_FLCID 4
IDLFLAG_FRETVAL 8
ImplTypeFlags列挙体
OLE Automation IMPLTYPEFLAG values
IMPLTYPEFLAG_FDEFAULT 1
IMPLTYPEFLAG_FSOURCE 2
IMPLTYPEFLAG_FRESTRICTED 4
IMPLTYPEFLAG_FDEFAULTVTABLE 8
InvokeKinds列挙体
OLE Automation INVOKEKIND values
INVOKE_UNKNOWN 0
INVOKE_FUNC 1
INVOKE_PROPERTYGET 2
INVOKE_PROPERTYPUT 4
INVOKE_PROPERTYPUTREF 8
INVOKE_EVENTFUNC 16
INVOKE_CONST 32
LibFlags列挙体
OLE Automation LIBFLAG values
LIBFLAG_FRESTRICTED 1
LIBFLAG_FCONTROL 2
LIBFLAG_FHIDDEN 4
LIBFLAG_FHASDISKIMAGE 8
ParamFlags列挙体
OLE Automation PARAMFLAG values
PARAMFLAG_NONE 0
PARAMFLAG_FIN 1
PARAMFLAG_FOUT 2
PARAMFLAG_FLCID 4
PARAMFLAG_FRETVAL 8
PARAMFLAG_FOPT 16
PARAMFLAG_FHASDEFAULT 32
PARAMFLAG_FHASCUSTDATA 64
SysKinds列挙体
OLE Automation SYS values
SYS_WIN16 0
SYS_WIN32 1
SYS_MAC 2
TliCustomFilterAction列挙体
Actions for CustomFilter.Visit
tliCfaLeave 0
tliCfaDuplicate 1
tliCfaExtract 2
tliCfaDelete 3
TliErrors列挙体
Custom errors raised by TLI
tliErrNoCurrentTypelib -2147220991
tliErrCantLoadLibrary -2147220990
tliErrTypeLibNotRegistered -2147220989
tliErrSearchResultsChanged -2147220988
tliErrNotApplicable -2147220987
tliErrIncompatibleData -2147220986
tliErrIncompatibleSearchType -2147220985
tliErrIncompatibleTypeKind -2147220984
tliErrInaccessibleImportLib -2147220983
tliErrNoDefaultValue -2147220982
tliErrDataNotAvailable -2147220981
tliErrNotAnEntryPoint -2147220980
tliErrStopFiltering -2147220979
tliErrArrayBoundsNotAvailable -2147220978
tliErrSearchResultsNotSorted -2147220977
tliErrTypeNotArray -2147220976
TliItemDataTypes列挙体
Determine ItemData content for GetMembers*Direct methods
tliIdtMemberID 0
tliIdtInvokeKinds 1
TliSearchTypes列挙体
Determines content of SearchResults collection
tliStClasses 1
tliStEvents 2
tliStConstants 4
tliStDeclarations 8
tliStAppObject 16
tliStRecords 32
tliStIntrinsicAliases 64
tliStUnions 128
tliStAll 239
tliStDefault 4096
TliVarType列挙体
OLE Automation VARIANT types
VT_EMPTY 0
VT_NULL 1
VT_I2 2
VT_I4 3
VT_R4 4
VT_R8 5
VT_CY 6
VT_DATE 7
VT_BSTR 8
VT_DISPATCH 9
VT_ERROR 10
VT_BOOL 11
VT_VARIANT 12
VT_UNKNOWN 13
VT_DECIMAL 14
VT_I1 16
VT_UI1 17
VT_UI2 18
VT_UI4 19
VT_I8 20
VT_UI8 21
VT_INT 22
VT_UINT 23
VT_VOID 24
VT_HRESULT 25
VT_PTR 26
VT_SAFEARRAY 27
VT_CARRAY 28
VT_USERDEFINED 29
VT_LPSTR 30
VT_LPWSTR 31
VT_RECORD 36
VT_FILETIME 64
VT_BLOB 65
VT_STREAM 66
VT_STORAGE 67
VT_STREAMED_OBJECT 68
VT_STORED_OBJECT 69
VT_BLOB_OBJECT 70
VT_CF 71
VT_CLSID 72
VT_VECTOR 4096
VT_ARRAY 8192
VT_BYREF 16384
VT_RESERVED 32768
TliWindowTypes列挙体
Values for window class of hWnd in Get*Direct methods
tliWtListBox 0
tliWtComboBox 1
TypeFlags列挙体
OLE Automation TYPEFLAG values
TYPEFLAG_NONE 0
TYPEFLAG_FAPPOBJECT 1
TYPEFLAG_FCANCREATE 2
TYPEFLAG_FLICENSED 4
TYPEFLAG_FPREDECLID 8
TYPEFLAG_FHIDDEN 16
TYPEFLAG_FCONTROL 32
TYPEFLAG_FDUAL 64
TYPEFLAG_FNONEXTENSIBLE 128
TYPEFLAG_FOLEAUTOMATION 256
TYPEFLAG_FRESTRICTED 512
TYPEFLAG_ALIASATTRIBUTES 528
TYPEFLAG_DEFAULTFILTER 528
TYPEFLAG_ENUMATTRIBUTES 528
TYPEFLAG_MODULEATTRIBUTES 528
TYPEFLAG_RECORDATTRIBUTES 528
TYPEFLAG_UNIONATTRIBUTES 528
TYPEFLAG_FAGGREGATABLE 1024
TYPEFLAG_COCLASSATTRIBUTES 1599
TYPEFLAG_FREPLACEABLE 2048
TYPEFLAG_FDISPATCHABLE 4096
TYPEFLAG_FREVERSEBIND 8192
TYPEFLAG_FPROXY 16384
TYPEFLAG_DISPATCHATTRIBUTES 23232
TYPEFLAG_INTERFACEATTRIBUTES 31680
TypeKinds列挙体
OLE Automation TYPEKIND values
TKIND_ENUM 0
TKIND_RECORD 1
TKIND_MODULE 2
TKIND_INTERFACE 3
TKIND_DISPATCH 4
TKIND_COCLASS 5
TKIND_ALIAS 6
TKIND_UNION 7
TKIND_MAX 8
VarFlags列挙体
OLE Automation VARFLAG values
VARFLAG_NONE 0
VARFLAG_FREADONLY 1
VARFLAG_FSOURCE 2
VARFLAG_FBINDABLE 4
VARFLAG_FREQUESTEDIT 8
VARFLAG_FDISPLAYBIND 16
VARFLAG_FDEFAULTBIND 32
VARFLAG_FHIDDEN 64
VARFLAG_FRESTRICTED 128
VARFLAG_DEFAULTFILTER 192
VARFLAG_FDEFAULTCOLLELEM 256
VARFLAG_FUIDEFAULT 512
VARFLAG_FNONBROWSABLE 1024
VARFLAG_FREPLACEABLE 2048
VARFLAG_FIMMEDIATEBIND 4096

■TLIを使用するための事前準備

TLIを使用するための事前準備は、以下の3ステップです。
⇒オブジェクトを使用するための事前準備とオブジェクトブラウザによる調査方法については、Excel VBAでオブジェクト指向プログラミング(事前準備編)を参照して下さい。

①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログでTypeLib Informationのチェックボックスにチェックを入れ、[OK]ボタンを押下。

②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。

  1. Dim ta As TLI.TLIApplication
  2. Dim tl As TLI.TypeLibInfo

③インスタンスの生成
プログラムの処理部でインスタンスを生成した後、TLIApplicationオブジェクトのTypeLibInfoFromFileメソッドでTypeLibInfoオブジェクトを生成。

  1. Set ta = New TLI.TLIApplication
  2. Set tl = ta.TypeLibInfoFromFile(“xxx.DLL")

■TLIを使用したタイプ・ライブラリ情報の取得方法

TypeLibInfoオブジェクトのTypeInfosプロパティ・Unionsプロパティにより、それぞれのコレクションを取得後、各オブジェクトのMembersプロパティによりMemberInfoオブジェクトを取得します。
引数の情報を取得したい場合は、さらにMemberInfoオブジェクトのParametersプロパティにより、ParameterInfoオブジェクトを取得します。

タイプ・ライブラリから全ての情報を取得したい場合

TypeLibInfoオブジェクトのTypeInfosプロパティによりTypeInfosコレクションを使用すれば、タイプ・ライブラリで定義されている「タイプ」を全て取得することができます。
但し、定義されている「タイプ」の種類によって取得できる情報が異なるため、TypeInfoオブジェクトのTypeKindプロパティまたはTypeKindStringプロパティにより種類を判定する必要があります。

  1. Dim ti As tli.TypeInfo
  2. Dim ii As tli.InterfaceInfo
  3. Dim mi As tli.MemberInfo
  4. Dim pi As tli.ParameterInfo
  5. For Each ti In tl.TypeInfos
  6.     Select Case ti.TypeKindString
  7.     Case “coclass"
  8.         For Each ii In ti.Interfaces
  9.             For Each mi In ii.Members
  10.                 For Each pi In mi.Members
  11.                     'CoClassのメソッド、プロパティ等の処理
  12.                 Next pi
  13.             Next mi
  14.         Next ii
  15.     Case “dispinterface", “module"
  16.         For Each mi In ti.Members
  17.             For Each pi In mi.Members
  18.                 'CoClass以外のメソッド、プロパティ等の処理
  19.             Next pi
  20.         Next mi
  21.     Case “enum"
  22.         For Each mi In ti.Members
  23.             '列挙体の処理
  24.         Next mi
  25.     End Select
  26. Next ti

タイプ・ライブラリから指定したクラスの情報を取得したい場合

TypeInfosコレクションのNamedItemプロパティにより、指定したクラス名のTypeInfoオブジェクトを取得すれば、後は前項と同様に処理を行うことができます。

  1. Dim ti As tli.TypeInfo
  2. Dim ci As tli.CoClassInfo
  3. Dim ii As tli.InterfaceInfo
  4. Dim mi As tli.MemberInfo
  5. Dim pi As tli.ParameterInfo
  6. Set ti = tl.TypeInfos.NamedItem(“クラス名"))
  7. Select Case ti.TypeKindString
  8. Case “coclass"
  9.     Set ci = tl.CoClasses.NamedItem(ti.Name)
  10.     For Each ii In ci.Interfaces
  11.         For Each mi In ii.Members
  12.             For Each pi In mi.Parameters
  13.             'CoClassのメソッド、プロパティ等の処理
  14.             Next pi
  15.         Next mi
  16.     Next ii
  17. Case “dispinterface", “module"
  18.     For Each mi In ti.Members
  19.         For Each pi In mi.Parameters
  20.             'CoClass以外のメソッド、プロパティ等の処理
  21.         Next pi
  22.     Next mi
  23. End Select

■オブジェクト・ブラウザと同等の情報を表示する方法

前項で述べた処理方式により、とりあえずタイプ・ライブラリの情報を参照できますが、オブジェクト・ブラウザと同等の情報を表示するためには、表示対象とするメンバーを絞り込んだうえ、表示に必要な情報を取得する必要があります。

オブジェクト・ブラウザでメソッドやプロパティを選択すると、下図のような定義情報(使用方法)が表示されますが、このような表示を行う際に必要な処理についても次項で説明します。

  • 種類 名称(引数1 As タイプ1, [引数2 As タイプ2 = 規定値]) As タイプ3
  • (※)種類は「Sub」「Function」「Property」「Event」のいずれか。

取得した情報から表示するメンバーを特定する方法

前述の方法で情報を取得すると、非開示の情報も含めた全ての情報が参照できてしまうため、各オブジェクトのAttributeを取得し、「hidden」または「restricted」のメンバーを除外します。

Attributeを取得するためにはAttributeStringsプロパティを使用し、ストリング型の配列に返されたAttributeの内容を判定します(以下のサンプルはMemberInfoオブジェクトの例です)。

(※)この判定だけだと一部のメンバーが余計に表示されてしまうため、後述のサンプル・プログラムでは、Nameの先頭1バイトが「_(アンダーバー)」のメンバーも除外しています。

  1. Dim attr() As String
  2. Dim i, acnt As Long
  3. acnt = mi.AttributeStrings(attr)
  4. If acnt <> 0 Then
  5.     For i = 1 To acnt
  6.         If (attr(i) = “hidden") Or (attr(i) = “restricted") Then
  7.             '除外するための処理
  8.         End If
  9.     Next i
  10. End If

メソッドやプロパティの「種類」を判定する方法

MemberInfoオブジェクトのInvokeKindプロパティで判定しますが、このプロパティの戻り値は下表のようになっているため、戻り値が「1」の場合には他の条件と組合せて判定する必要があります。
CoClassの場合、TypeInfoオブジェクトのDefaultEventInterfaceプロパティでIntefacesコレクションを取得すると、Eventとして定義されたメンバーを取得できるため、後述のサンプル・プログラムでは「Method」と判定されたメンバーについて、Eventとして定義されたメンバーとMemberIDプロパティの値で突合し、マッチした場合に「Event」に書換えています(EventとMethodで同じ名前のメンバーが存在するケースがあるため、Nameだけで突合すると正しく判定できません)。
書換えられずに残ったメンバーが「Method」ですが、ReturnTypeプロパティの値が「Void」であれば「Sub」、「Void」以外であれば「Function」です。

Propertyは戻り値が細かく分かれているので判定は容易ですが、同じ名称で複数メンバーが存在する(例えば、「Property Get」と「Property Put」の2メンバー)ため、「読み取り専用」の判定を行う場合は注意が必要です。
なお、MemberIDプロパティの値が0の場合は、規定のプロパティ(※)です。

(※)プロパティの指定を省略した場合に仮定されるプロパティ。オブジェクト・ブラウザの場合は、プロパティのアイコンに「レ」点の付いたアイコンで表示されます。

(InvokeKindプロパティの戻り値)

戻り値 内容
1 「Sub」「Function」「Event」
2 「Property Get」
4 「Property Put」
8 「Property Put Ref」

引数の情報を取得する方法

引数の情報はMemberInfoオブジェクトのParametersプロパティによりParametersコレクションを取得し、ParameterInfoオブジェクトを順に参照して取得します。

DefaultプロパティがTrueであれば省略可能を意味しており、DefaultValueプロパティに設定されている値が規定値です。
引数の型が列挙体を示している場合は、DefaultValueプロパティの値を列挙体で定義されている名称に置換えます(下図参照)。

  1. Set ti = tl.TypeInfos.NamedItem(列挙体の名称)
  2. For Each mi In ti.Members
  3.     If mi.Value = (DefaultValueの値) Then
  4.         (DefaultValueの値) = mi.Name
  5.     End If
  6. Next mi

タイプ(型)の情報を取得する方法

VarTypeInfoクラスの項で説明した通り、標準的な「タイプ」についてはVarTypeプロパティでTliVarType列挙体で定義された値を返し、ユーザが定義した「タイプ」についてはTypeInfoNumberプロパティでTypeInfoクラスで定義された「タイプ」のインデックス番号を返します。

TliVarType列挙体のNameは「VT_XXX」といった形式で定義されているので、基本的には「VT_」の部分を取り除けば良いのですが、それだけではオブジェクト・ブラウザで表示される形にはなりませんので、デコード処理が必要になります(後述のサンプル・プログラム参照)。

VarTypeプロパティの値が「0(Empty)」の場合は、TypeInfoNumberプロパティの値(インデックス番号)でTypeInfoオブジェクトの値(デコード値)を取得します。

  1. If (VarTypeの値) = “Empty" Then
  2.     If vi.TypeInfoNumber <> -1 Then
  3.         (VarTypeのデコード値) = tl.TypeInfos.Item(vi.TypeInfoNumber + 1)
  4.     End If
  5. End If

■タイプ・ライブラリからメソッド、プロパティ、列挙体の情報を取得する処理

タイプ・ライブラリからメソッド、プロパティ、列挙体の情報を取得し、Excelシートに一覧表示表示するプログラムです。
⇒本稿に掲載したメソッド、プロパティ、列挙体等の表は、このExcelツールの処理結果を加工したものです。

データ宣言部とメイン・プロシジャ

行番号22~42で項目見出しをセット、行番号43でTLIApplicationオブジェクト、行番号44でTLIのTypeLibInfoオブジェクト、行番号45で処理対象となるタイプ・ライブラリのTypeLibInfoオブジェクトを作成しています。
行番号49~108の繰返し処理の中は「CoClass」「CoClass以外」「列挙体」で処理を分けています。
行番号54~65で「CoClass」の処理を行った後、行番号66~76で「Method」を「Event」に置換える処理を行っています(※)。
行番号78~87は「CoClass以外」の処理、行番号89~105は「列挙体」の処理です。
行番号59、82では改行せずに「InvokeKind」を追加していますが、これは複数メンバーに分かれている「Property」の情報を1行にまとめています。
なお、行番号50~51、行番号56~57、行番号79~80、行番号94~95は、非開示のメンバーを除外する処理です。

(※)DefaultEventInterfaceプロパティは、CoClassの場合しか使用できないため、「CoClass」の箇所にだけ置換え処理を入れています。

  1. Dim sht As Worksheet
  2. Dim tli As tli.TypeLibInfo
  3. Dim ta As tli.TLIApplication
  4. Dim tl As tli.TypeLibInfo
  5. Dim ci As tli.CoClassInfo
  6. Dim ii As tli.InterfaceInfo
  7. Dim mi As tli.MemberInfo
  8. Dim pi As tli.ParameterInfo
  9. Dim si As tli.ConstantInfo
  10. Dim ti As tli.TypeInfo
  11. Dim vi As tli.VarTypeInfo
  12. Dim dti As tli.TypeInfo
  13. Dim dmi As tli.MemberInfo
  14. Dim attr() As String
  15. Dim VarTypeName() As String
  16. Dim VarTypeValue() As Long
  17. Dim i, rcnt, ccnt, acnt As Long
  18. Private Sub Sample2()
  19.     Set sht = ActiveSheet
  20.     sht.Cells.NumberFormatLocal = “@"
  21.     sht.Range(“A1:L2").Interior.Color = RGB(127, 127, 127)
  22.     sht.Range(“A1:L2").Font.Bold = True
  23.     sht.Range(“A1:L2").HorizontalAlignment = xlCenter
  24.     sht.Range(“A1") = “TypeInfo"
  25.     sht.Range(“A1:B1").Merge
  26.     sht.Range(“A2") = “Name"
  27.     sht.Range(“B2") = “TypeKind"
  28.     sht.Range(“C1") = “Member"
  29.     sht.Range(“C1:G1").Merge
  30.     sht.Range(“C2") = “MemberID"
  31.     sht.Range(“D2") = “Name"
  32.     sht.Range(“E2") = “InvokeKind"
  33.     sht.Range(“F2") = “ReturnType"
  34.     sht.Range(“G2") = “HelpString"
  35.     sht.Range(“H1") = “Parameter"
  36.     sht.Range(“H1:L1").Merge
  37.     sht.Range(“H2") = “Count"
  38.     sht.Range(“I2") = “Name"
  39.     sht.Range(“J2") = “TypeInfo"
  40.     sht.Range(“K2") = “Default"
  41.     sht.Range(“L2") = “DefaultValue"
  42.     Set ta = New tli.TLIApplication
  43.     Set tli = ta.TypeLibInfoFromFile(“TLBINF32.DLL")
  44.     Set tl = ta.TypeLibInfoFromFile(“xxx.DLL")
  45.     Call InitializeTable
  46.     rcnt = 2
  47.     For Each ti In tl.TypeInfos
  48.         acnt = ti.AttributeStrings(attr)
  49.         If (Left(ti.Name, 1) <> “_") And (CheckAttribute = True) Then
  50.             Select Case ti.TypeKindString
  51.             Case “coclass"
  52.                 For Each ii In ti.Interfaces
  53.                     For Each mi In ii.Members
  54.                         acnt = mi.AttributeStrings(attr)
  55.                         If (Left(mi.Name, 1) <> “_") And (CheckAttribute = True) Then
  56.                             If (rcnt >= 3) And (sht.Cells(rcnt, 4) = mi.Name) Then
  57.                                 sht.Cells(rcnt, 5) = sht.Cells(rcnt, 5) & “," & DecodeInvokeKinds(mi.InvokeKind)
  58.                             Else
  59.                                 Call DisplayMemberInfo
  60.                             End If
  61.                         End If
  62.                     Next mi
  63.                 Next ii
  64.                 Set ii = ti.DefaultEventInterface
  65.                 If Not (ii Is Nothing) Then
  66.                     For Each mi In ii.Members
  67.                         For i = 3 To sht.Cells(sht.Rows.Count, 4).End(xlUp).Row
  68.                             If (sht.Cells(i, 1) = ti.Name) And (sht.Cells(i, 3) = mi.MemberId) Then
  69.                                 sht.Cells(i, 5) = “Event"
  70.                                 Exit For
  71.                             End If
  72.                         Next i
  73.                     Next mi
  74.                 End If
  75.             Case “dispinterface", “module"
  76.                 For Each mi In ti.Members
  77.                     acnt = mi.AttributeStrings(attr)
  78.                     If (Left(mi.Name, 1) <> “_") And (CheckAttribute = True) Then
  79.                         If (rcnt >= 3) And (sht.Cells(rcnt, 4) = mi.Name) Then
  80.                             sht.Cells(rcnt, 5) = sht.Cells(rcnt, 5) & “," & DecodeInvokeKinds(mi.InvokeKind)
  81.                         Else
  82.                             Call DisplayMemberInfo
  83.                         End If
  84.                     End If
  85.                 Next mi
  86.             Case “enum"
  87.                 rcnt = rcnt + 1
  88.                 sht.Cells(rcnt, 1) = ti.Name
  89.                 sht.Cells(rcnt, 2) = ti.TypeKindString
  90.                 sht.Cells(rcnt, 7) = ti.HelpString
  91.                 For Each mi In ti.Members
  92.                     acnt = mi.AttributeStrings(attr)
  93.                     If (Left(mi.Name, 1) <> “_") And (CheckAttribute = True) Then
  94.                         rcnt = rcnt + 1
  95.                         sht.Cells(rcnt, 1) = ti.Name
  96.                         sht.Cells(rcnt, 2) = ti.TypeKindString
  97.                         sht.Cells(rcnt, 3) = mi.MemberId
  98.                         sht.Cells(rcnt, 4) = mi.Name
  99.                         sht.Cells(rcnt, 5) = mi.Value
  100.                         sht.Cells(rcnt, 6) = DecodeVarType(mi.ReturnType)
  101.                         sht.Cells(rcnt, 7) = mi.HelpString
  102.                     End If
  103.                 Next mi
  104.             End Select
  105.         End If
  106.     Next ti
  107.     Set vi = Nothing
  108.     Set pi = Nothing
  109.     Set mi = Nothing
  110.     Set ii = Nothing
  111.     Set ti = Nothing
  112.     Set tl = Nothing
  113.     Set tli = Nothing
  114.     Set ta = Nothing
  115. End Sub

メンバーの属性をチェックするサブ・プロシジャ

非開示のメンバーを除外する処理が何箇所もあって煩雑なため、Attributeの中に「hidden」または「restricted」が存在するかどうかを判定する処理を関数化したものです。

  1. Private Function CheckAttribute() As Boolean
  2.     Dim i As Integer
  3.     CheckAttribute = True
  4.     If acnt <> 0 Then
  5.         For i = 1 To acnt
  6.             If (attr(i) = “hidden") Or (attr(i) = “restricted") Then
  7.                 CheckAttribute = False
  8.             End If
  9.         Next i
  10.     End If
  11. End Function

メンバーの情報をセットするサブ・プロシジャ

「CoClass」と「CoClass以外」で同様の処理を行うため、編集処理を括り出したものです。

  1. Private Sub DisplayMemberInfo()
  2.     rcnt = rcnt + 1
  3.     sht.Cells(rcnt, 1) = ti.Name
  4.     sht.Cells(rcnt, 2) = ti.TypeKindString
  5.     sht.Cells(rcnt, 3) = mi.MemberId
  6.     sht.Cells(rcnt, 4) = mi.Name
  7.     sht.Cells(rcnt, 5) = DecodeInvokeKinds(mi.InvokeKind)
  8.     sht.Cells(rcnt, 6) = DecodeVarType(mi.ReturnType)
  9.     sht.Cells(rcnt, 7) = mi.HelpString
  10.     sht.Cells(rcnt, 8) = mi.Parameters.Count
  11.     ccnt = 9
  12.     For Each pi In mi.Parameters
  13.         sht.Cells(rcnt, ccnt) = pi.Name
  14.         sht.Cells(rcnt, ccnt + 1) = DecodeVarType(pi.VarTypeInfo)
  15.         sht.Cells(rcnt, ccnt + 2) = pi.Default
  16.         If pi.Default = True Then
  17.             sht.Cells(rcnt, ccnt + 3) = DecodeDefaultValue(sht.Cells(rcnt, ccnt + 1), pi.DefaultValue)
  18.         End If
  19.         ccnt = ccnt + 4
  20.     Next pi
  21. End Sub

タイプの情報をデコードするサブ・プロシジャ

行番号1~41でデコード用の情報を内部テーブルに展開しておき、行番号43~64で内部テーブルを使用してデコードしています。
デコードした結果が「Empty」の場合はユーザ定義型とみなし、行番号61でTypeInfoオブジェクトから名称を取得しています。
行番号48の判定を「If wNum >= VarTypeValue(i) Then」とし、行番号56の「wNum = wNum – VarTypeValue(i)」でVarTypeの減算処理を行っていますが、例えば「Array(=8192)」かつ「String(=8)」の場合、VarTypeの値が「8200(=8192+8)」のように合算値となっているためです。
行番号66~83はInvokeKindのデコード処理、行番号85~99はDefaultValueのデコード処理で、引数の型が列挙体を示している場合には、行番号94でDefaultValueプロパティの値を列挙体で定義されている名称に置換えています。

  1. Private Sub InitializeTable()
  2.     ReDim VarTypeName(1 To tli.Constants.NamedItem(“TliVarType").Members.Count)
  3.     ReDim VarTypeValue(1 To tli.Constants.NamedItem(“TliVarType").Members.Count)
  4.     For i = 1 To tli.Constants.NamedItem(“TliVarType").Members.Count
  5.         VarTypeValue(i) = tli.Constants.NamedItem(“TliVarType").Members.Item(i).Value
  6.         Select Case VarTypeValue(i)
  7.         Case 2
  8.             VarTypeName(i) = “Integer"
  9.         Case 3
  10.             VarTypeName(i) = “Long"
  11.         Case 4
  12.             VarTypeName(i) = “Single"
  13.         Case 5
  14.             VarTypeName(i) = “Double"
  15.         Case 6
  16.             VarTypeName(i) = “Currency"
  17.         Case 8
  18.             VarTypeName(i) = “String"
  19.         Case 9
  20.             VarTypeName(i) = “Object"
  21.         Case 11
  22.             VarTypeName(i) = “Boolean"
  23.         Case 17
  24.             VarTypeName(i) = “Byte"
  25.         Case 22
  26.             VarTypeName(i) = “Integer"
  27.         Case 23
  28.             VarTypeName(i) = “UInteger"
  29.         Case 25
  30.             VarTypeName(i) = “HRESULT"
  31.         Case 29
  32.             VarTypeName(i) = “User Defined"
  33.         Case 72
  34.             VarTypeName(i) = “Class ID"
  35.         Case 16384
  36.             VarTypeName(i) = “By Ref"
  37.         Case Else
  38.             VarTypeName(i) = Mid(tli.Constants.NamedItem(“TliVarType").Members.Item(i).Name, 4, 1) & LCase(Mid(tli.Constants.NamedItem(“TliVarType").Members.Item(i).Name, 5))
  39.         End Select
  40.     Next i
  41. End Sub
  42. Private Function DecodeVarType(vi As tli.VarTypeInfo) As String
  43.     Dim wNum, i As Integer
  44.     wNum = vi.VarType
  45.     DecodeVarType = “"
  46.     For i = UBound(VarTypeValue) To 1 Step -1
  47.         If wNum >= VarTypeValue(i) Then
  48.             If DecodeVarType = “" Then
  49.                 DecodeVarType = VarTypeName(i)
  50.             Else
  51.                 If VarTypeName(i) <> “Empty" Then
  52.                     DecodeVarType = DecodeVarType & " " & VarTypeName(i)
  53.                 End If
  54.             End If
  55.             wNum = wNum – VarTypeValue(i)
  56.         End If
  57.     Next i
  58.     If DecodeVarType = “Empty" Then
  59.         If vi.TypeInfoNumber <> -1 Then
  60.             DecodeVarType = tl.TypeInfos.Item(vi.TypeInfoNumber + 1)
  61.         End If
  62.     End If
  63. End Function
  64. Private Function DecodeInvokeKinds(InvokeKindNum As Integer) As String
  65.     Select Case InvokeKindNum
  66.     Case 1
  67.         DecodeInvokeKinds = “Method"
  68.     Case 2
  69.         DecodeInvokeKinds = “Property Get"
  70.     Case 4
  71.         DecodeInvokeKinds = “Property Put"
  72.     Case 8
  73.         DecodeInvokeKinds = “Property Put Ref"
  74.     Case 16
  75.         DecodeInvokeKinds = “Event"
  76.     Case 32
  77.         DecodeInvokeKinds = “Constant"
  78.     Case Else
  79.         DecodeInvokeKinds = “Unknown"
  80.     End Select
  81. End Function
  82. Private Function DecodeDefaultValue(VarType As String, DefaultValue As Variant) As Variant
  83.     DecodeDefaultValue = DefaultValue
  84.     Set dti = tl.TypeInfos.NamedItem(VarType)
  85.     If dti Is Nothing Then
  86.         Exit Function
  87.     End If
  88.     If dti.TypeKindString = “enum" Then
  89.         For Each dmi In dti.Members
  90.             If dmi.Value = DefaultValue Then
  91.                 DecodeDefaultValue = dmi.Name
  92.                 Exit Function
  93.             End If
  94.         Next dmi
  95.     End If
  96. End Function

Excel VBAのタイプ情報について

前掲のサンプル・プログラムでEXCEL.EXEを解析したところ、一部の機能が外部のオブジェクト・ライブラリを参照していることがわかりました。

外部のオブジェクト・ライブラリを参照している場合、VarTypeInfoクラスのIsExternalTypeプロパティにTrueが設定され(通常はFalse)、TypeLibInfoExternalプロパティにアプリケーション名が設定されています。

EXCEL.EXEで使用している外部のオブジェクト・ライブラリは下表の通りです。

アプリケーション名 ファイル名 説明
Office MSO.DLL Microsoft Office xx.x Object Library
VBIDE VBE6EXT.OLB Microsoft Visual Basic for Applications Extensibility x.x

(サンプル・プログラムの修正例)
TypeLibInfo用のオブジェクト変数として、tli、tlo、tlv、tleの4つを定義し、TypeLibInfoFromFileメソッドでTLBINF32.DLL、MSO.DLL、VBE6EXT.OLB、EXCEL.EXEを割当てたうえ、DecodeVarType関数を以下のように修正すると正しく表示されます(行番号19~28が修正箇所です)。

  1. Private Function DecodeVarType(vi As tli.VarTypeInfo) As String
  2.     Dim wNum, i As Integer
  3.     wNum = vi.VarType
  4.     DecodeVarType = “"
  5.     For i = UBound(VarTypeValue) To 1 Step -1
  6.         If wNum >= VarTypeValue(i) Then
  7.             If DecodeVarType = “" Then
  8.                 DecodeVarType = VarTypeName(i)
  9.             Else
  10.                 If VarTypeName(i) <> “Empty" Then
  11.                     DecodeVarType = DecodeVarType & " " & VarTypeName(i)
  12.                 End If
  13.             End If
  14.             wNum = wNum – VarTypeValue(i)
  15.         End If
  16.     Next i
  17.     If DecodeVarType = “Empty" Then
  18.         If vi.TypeInfoNumber <> -1 Then
  19.             If vi.IsExternalType = True Then
  20.                 Select Case vi.TypeLibInfoExternal
  21.                 Case “Office"
  22.                     DecodeVarType = tlo.TypeInfos.Item(vi.TypeInfoNumber + 1)
  23.                 Case “VBIDE"
  24.                     DecodeVarType = tlv.TypeInfos.Item(vi.TypeInfoNumber + 1)
  25.                 End Select
  26.             Else
  27.                 DecodeVarType = tle.TypeInfos.Item(vi.TypeInfoNumber + 1)
  28.             End If
  29.         End If
  30.     End If
  31. End Function

 

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ

ファイル解析

Posted by hides