ブラックボックスを暴け:TLBInf32を用いたCOMコンポーネントの動的リバースエンジニアリング
現場で遭遇する「仕様書がどこにもないレガシーDLL」。古い基幹システムから抽出された怪しげなCOMコンポーネント。これらに直面したとき、多くのエンジニアは「とりあえずネットで似たようなコードを探す」という非効率な迷宮に入り込みます。
しかし、真の自動化エンジニアは違います。コンポーネント自身に自らの素性を語らせるのです。
今日は、`TLBInf32.dll`(TypeLib Information)を駆使して、未知のCOMオブジェクトからプロパティとメソッドを動的に抽出する、極限の解析手法を伝授します。
—
1. なぜ「推測」ではなく「解析」なのか
VBScriptでCOMオブジェクトを扱う際、`CreateObject`した後に「何が使えるか」をIDEのインテリセンスに頼れない状況は、開発の大きなボトルネックです。ドキュメントがないからといって試行錯誤のデバッグを繰り返すのは時間の浪費です。
`TLBInf32.dll`は、COMのメタデータを格納したタイプライブラリを解読するための強力なツールです。これを使えば、実行時に「どんな引数が必要か」「戻り値の型は何か」を完全にリストアップできます。
—
2. 準備:TLBInf32.dllの登録
このライブラリは標準インストールされていないことが多いため、まずはシステムに登録する必要があります。
1. `TLBInf32.dll` を入手(主にVisual Studio等の古い開発環境に同梱)。
2. 管理者権限のコマンドプロンプトで以下のコマンドを実行。
regsvr32 C:\Path\To\TLBInf32.dll
—
3. 実践:COMメンバー自動抽出スクリプト
以下に、対象となるProgIDを入力するだけで、全メンバーをCSV形式で出力する堅牢なスクリプトを提示します。
‘ 解析対象のProgID
Dim targetProgID : targetProgID = “Scripting.FileSystemObject”
Dim outFilePath : outFilePath = “C:\Temp\COM_Analysis.csv”
‘ TLIオブジェクトの生成
Dim TLI : Set TLI = CreateObject(“TLI.TLIApplication”)
Dim objInfo : Set objInfo = TLI.InterfaceInfoFromObject(CreateObject(targetProgID))
Dim fso : Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim file : Set file = fso.CreateTextFile(outFilePath, True)
‘ ヘッダー出力
file.WriteLine “MemberName,Type,ReturnType,InvokeKind”
‘ メンバーの走査
Dim member
For Each member In objInfo.Members
‘ メソッド名、型、Invokeの種類を取得
file.WriteLine member.Name & “,” & _
GetMemberType(member.MemberType) & “,” & _
member.ReturnType.VarType & “,” & _
member.InvokeKind
Next
file.Close
Set TLI = Nothing
WScript.Echo “解析完了: ” & outFilePath
‘ メンバー型を文字列に変換するヘルパー関数
Function GetMemberType(mType)
Select Case mType
Case 1 : GetMemberType = “Method”
Case 2 : GetMemberType = “PropertyGet”
Case 4 : GetMemberType = “PropertyPut”
Case Else : GetMemberType = “Unknown”
End Select
End Function
—
4. 現場で生き残るための設計思想
このスクリプトを単なる解析用で終わらせてはいけません。プロダクションコードに組み込む際は、以下の3点に注意してください。
① オブジェクトのライフサイクル管理
`CreateObject`はコストの高い操作です。特に解析対象が重いDLLの場合、ループ内での生成は厳禁。必ず一度生成したインスタンスをキャッシュし、使い回す設計にしてください。
② エラーハンドリングの徹底
「未ドキュメントのCOM」は、メソッドを呼んだ瞬間にプロセスごとクラッシュするリスクを孕んでいます。`On Error Resume Next`を局所的に使用し、`Err.Number`を厳密にチェックする習慣を身につけてください。
③ データベース連携時のデータ型変換
`TLBInf32`で判明した型情報(`VarType`)と、データベース側のデータ型が一致しないケースが多発します。VBScriptの型は非常にルーズであるため、SQLに値を投げる前に必ず `CLng()` や `CStr()` で明示的なキャストを行うのが、バグを未然に防ぐ唯一の道です。
—
最後に:エンジニアとしての心構え
「仕様書がない」と嘆くのはアマチュアです。プロは、システムが持っているメタデータにアクセスし、自ら仕様書を生成します。
この手法をマスターすれば、レガシーシステムのブラックボックスは「解析可能なデータ」へと姿を変えます。今日から、見えないものに怯えるのではなく、見えないものを暴くエンジニアへ進化してください。
あなたのコードが、次なる自動化の礎となることを期待しています。
