ActiveX EXE や DLL, OCX(いわゆるCOM)が公開している Type Library 情報をダンプするスクリプト

VB6でCOMコンポーネントを開発してると、TypeLibIDとかCLSIDの不一致でソースコードが開けなくなったり、いままで動いていたプログラムが動かなくなったりという場面によく遭遇します。(とくにCOMコンポーネントの開発に不慣れで「COM」というものをよく理解していない場合)

VisualStudioにはOLEViewerというツールがついてますが、すでにレジストリへ登録されているCOMコンポーネントしか対象にしてないのと、膨大なリストの中から目的のコンポーネントを探すのが大変だったりして、いまひとつ使い勝手は良くないです。

そこで、探してみたところCOMコンポーネントが公開しているTypelib情報に簡単にアクセスするためのCOMコンポーネントが存在していることがわかりました。それは、Tlbinf32.dllで、OSに付属しています。
今回、このTlbinf32.dllを使って、Exe形式やDll,OCX などの形で提供されているCOMコンポーネントのTypeLib情報をダンプするスクリプトを作ってみました。

使い方は以下のような感じです。

> cscript //nologo dumpTypelib.vbs /target:c:\Windows\System32\Tlbinf32.dll

[Typelib]
        Name=TLI
        HelpString=TypeLib Information
        GUID={8B217740-717D-11CE-AB5B-D41203C10000}
        Version=1.0
[TypeInfos]
        [module]_DirectCalls  {00000000-0000-0000-0000-000000000000}
                (Method) NewGuid() as String
                (Method) GetTypeInfoAttributeStrings(AttributeMask as Integer, AttributeArray as Array of String()) as Integer
                (Method) GetImplAttributeStrings(AttributeMask as Integer, AttributeArray as Array of String()) as Integer
                (Method) GetLibraryAttributeStrings(AttributeMask as Integer, AttributeArray as Array of String()) as Integer
                (Method) GetFunctionAttributeStrings(AttributeMask as Integer, AttributeArray as Array of String()) as Integer

            :
  
        [dispinterface]VarTypeInfo  {8B21774B-717D-11CE-AB5B-D41203C10000}
                (Method) QueryInterface(riid as GUID, ppvObj as Empty) as Empty
                (Method) AddRef() as Long
                (Method) Release() as Long
                (Method) GetTypeInfoCount(pctinfo as Empty) as Empty
                (Method) GetTypeInfo(itinfo as Empty, lcid as Long, pptinfo as Empty) as Empty

            :
  

スクリプトのパラメタ /target: にダンプ対象のCOMコンポーネントのファイルを指定すると、上記のように typelib の GUID やら、 Interface の GUID , Class の GUID などを出力します。

これを応用すれば、WinMergeとかで、コンポーネントのバージョン間の差異の比較とか、もうすこし簡単になるかもしれないですね。

参考

Visual Basic: Inspect COM Components Using the TypeLib Information Object Library
Tlbinf32.dllの使い方を詳しく解説している記事。(英語)

ファイル: Tlbinf32.exe: Tlbinf32.dll のファイルのヘルプ
Tlbinf32.dll のヘルプファイルのダウンロードページ。Windows7 64bit では警告が出て自己解凍できなかったので、拡張子を.zipに変換して自力で解凍した。