VBScriptを掌握せよ:ADODB.Streamで操るバイナリパッチの極意
世の中の多くのエンジニアは、VBScriptを「古い」「遅い」「時代遅れ」と切り捨てる。だが、それは彼らがWindowsの深層にあるCOM(Component Object Model)の力を理解していないからだ。
特に、バイナリファイルを直接操作する際、わざわざ高コストな言語を導入する必要はない。OSに標準搭載された `ADODB.Stream` を正しく使いこなせば、メモリ効率を極限まで高めた堅牢なバイナリ置換エンジンを、わずか数十行で構築できる。
今日は、テキストエディタでは太刀打ちできない巨大なバイナリデータに対し、安全かつ高速に特定のシグネチャを検索し、書き換えるための「プロフェッショナルな設計術」を伝授する。
—
1. なぜADODB.Streamを選択するのか?
バイナリ操作において最も避けるべきは、ファイルをすべてメモリ上に展開することだ。数GBのファイルを読み込めば、VBScriptのプロセスは即座にメモリ不足(OOM)でクラッシュする。
`ADODB.Stream` は、「ストリーム指向」のインターフェースを持つ。必要な分だけバッファを切り出し、ポインタを制御することで、ファイルサイズに依存しない安定したパッチ処理を可能にする。これが、業務自動化において「止まらないスクリプト」を書くための大前提だ。
—
2. 堅牢なバイナリ置換エンジンの実装
以下に、特定のバイトパターンを検索し、別のパターンに置換するプロダクション・レベルのコードを示す。
‘ バイナリ置換メイン処理
Function PatchBinaryFile(strFilePath, arrSearch, arrReplace)
Dim objStream: Set objStream = CreateObject(“ADODB.Stream”)
‘ バイナリモードで読み込み
objStream.Type = 1 ‘ adTypeBinary
objStream.Open
objStream.LoadFromFile strFilePath
‘ ファイル全体をバイト配列として取得
Dim binData: binData = objStream.Read
objStream.Close
‘ バイナリ変換処理(ADODB.Streamは直接編集よりメモリ上のバイト配列処理が高速)
Dim strData: strData = BinaryToString(binData)
Dim searchStr: searchStr = BytesToString(arrSearch)
Dim replaceStr: replaceStr = BytesToString(arrReplace)
‘ 検索と置換
If InStr(1, strData, searchStr, 0) > 0 Then
strData = Replace(strData, searchStr, replaceStr, 1, -1, 0)
‘ 結果を書き出し
objStream.Open
objStream.Write StringToBytes(strData)
objStream.SaveToFile strFilePath & “.patched”, 2 ‘ adSaveCreateOverWrite
objStream.Close
PatchBinaryFile = True
Else
PatchBinaryFile = False
End If
Set objStream = Nothing
End Function
‘ 【重要】バイト配列と文字列の相互変換ユーティリティ
‘ ADODB.Streamとバイナリ操作の要は「型」の整合性にある
Private Function BytesToString(arrBytes)
Dim i, s
For i = 0 To UBound(arrBytes)
s = s & Chr(arrBytes(i))
Next
BytesToString = s
End Function
—
3. 実務で「失敗しない」ための3つの鉄則
コードをコピペして満足してはいけない。真のエンジニアなら、以下の3点に注意を払うべきだ。
① 境界条件のチェック(境界防御)
バイナリ置換は破壊的だ。失敗すれば元のファイルは二度と戻らない。必ず `SaveToFile` の前に、元のファイルのバックアップを自動生成するロジックを組み込むこと。`strFilePath & “.bak”` を作成する一行を惜しんではならない。
② パフォーマンスの重み
`InStr` や `Replace` は文字列関数だが、`ADODB.Stream` で読み込んだバイナリを `Chr()` で文字列化する手法は、小〜中規模ファイル(数百MB以下)では極めて高速に動作する。しかし、数GBを超えるファイルを扱う場合は、ストリームの `Read` メソッドでチャンク(塊)ごとに読み込む「チャンク読み込みループ」に切り替える必要がある。
③ 文字コードの罠
`ADODB.Stream` の `Type` を `2 (adTypeText)` に設定してしまうと、特定のバイト列がエンコーディングによって解釈され、データが壊れる。バイナリ操作時は必ず `Type = 1 (adTypeBinary)` を厳守すること。 これを忘れるだけで、パッチ後のファイルはゴミとなる。
—
4. 最後に:エンジニアとしての矜持
VBScriptは「古い」のではない。「完成されている」のだ。Windows環境において、これほど低レイヤーかつ手軽にバイナリを直接叩ける言語は他にない。
今回解説した技術は、単なる置換作業にとどまらず、暗号化された設定ファイルのパッチ、古いレガシーアプリのパラメータ調整、自動化ツールによるバイナリレベルのハッキング的修正など、あらゆる現場で応用が効く。
このコードをただの道具にするか、それともあなたの武器とするか。すべては、このスクリプトの先にある「業務の自動化」という目的にどれだけ真摯に向き合えるか、にかかっている。
さあ、コードを書き換え、あなたの現場に革命を起こしてほしい。
