【テクニカル・上級編】【命名パイプ擬似実装】レジストリとFileSystemObjectを組み合わせた複数VBScriptプロセス間での高速メッセージ通信 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptの限界を突破せよ:レジストリとFSOによる「疑似IPC」実装の極意

VBScriptは、現代のモダンな言語と比較すれば確かに「化石」だ。しかし、Windowsの心臓部に深く根を下ろしたこの言語は、適切に扱えば今なお最強のタスク自動化兵器となり得る。

多くのエンジニアは、別プロセスで動くスクリプト同士の連携を諦め、テキストファイルの読み書きという原始的な手段に逃げる。だが、I/O待ちのオーバーヘッドが許されない現場においては、それは「罪」だ。

本稿では、レジストリの高速なメモリキャッシュ性能とFileSystemObjectのロック制御を組み合わせた、VBScriptにおける極限のプロセス間通信(IPC)アーキテクチャを提示する。

1. なぜ「ファイル」ではなく「レジストリ+ロック」なのか

FileSystemObject(FSO)単体での読み書きは、ディスクI/Oのレイテンシに直結する。OSはレジストリ(`HKEY_CURRENT_USER`以下など)へのアクセスをメモリキャッシュで最適化しているため、極小サイズのメッセージのやり取りであれば、ファイルシステムよりも圧倒的に高速だ。

ただし、レジストリには競合(Race Condition)という脆弱性がある。これを制御するために、「アトミックなロックファイル」という概念を導入する。

2. 実装の心臓部:排他制御と高速伝送

以下のコードは、レジストリをデータバスとし、空のファイル作成をセマフォ(ロック)として利用する疑似IPCクラスである。

‘ VBScript IPCクラス(抜粋)
Class IPCChannel
Private FSO, WshShell, LockFile, RegKey

Private Sub Class_Initialize()
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Set WshShell = CreateObject(“WScript.Shell”)
LockFile = WshShell.ExpandEnvironmentStrings(“%TEMP%\ipc_lock.tmp”)
RegKey = “HKCU\Software\MyApp\IPC_Channel\”
End Sub

‘ 排他制御を伴うメッセージ送信
Public Sub SendMessage(msg)
Do While FSO.FileExists(LockFile)
WScript.Sleep 10 ‘ CPU負荷を抑えつつ待機
Loop
‘ ロック取得
FSO.CreateTextFile(LockFile, True).Close

‘ レジストリへデータ書き込み
WshShell.RegWrite RegKey & “Data”, msg, “REG_SZ”

‘ ロック解放
FSO.DeleteFile LockFile
End Sub

‘ オブジェクトの明示的解放(メモリ管理の鉄則)
Private Sub Class_Terminate()
Set FSO = Nothing
Set WshShell = Nothing
End Sub
End Class

3. チーフアーキテクトが説く「極限の最適化」

この実装を本番環境で運用する際、以下の3点を徹底しなければ、システムは必ず破綻する。

① CPUスピンロックの回避

`WScript.Sleep`を省いてはいけない。VBScriptはシングルスレッドで動作するため、無限ループで待機するとCPUコアを100%消費し、OS全体のレスポンスを著しく低下させる。`WScript.Sleep 10`は、Windowsのプリエンプティブ・マルチタスクの恩恵を最大限に受けるための「優しさ」だ。

② メモリリークの排除

`Set Object = Nothing`を怠るな。VBScriptのガベージコレクション(GC)は予測不能だ。特にWSH(Windows Script Host)環境下では、長時間稼働するスクリプトでオブジェクトの解放を忘れると、プロセスのワーキングセットは肥大化し続け、やがてページファイルが枯渇する。

③ レジストリの「掃除」を忘れない

レジストリを高速なメモリキャッシュとして使う代償は、ゴミデータの蓄積だ。終了処理(`Class_Terminate`)で確実にキーを削除するか、あるいは通信専用の領域として適切に管理し、定期的にパージする設計を組み込むこと。

4. このアーキテクチャの適用範囲

この手法が最も輝くのは、以下のシナリオだ。

  • GUI(HTA)からのバックグラウンドタスク制御: HTAで進捗表示を行い、背後で動く複数のVBScriptから計算結果をリアルタイムに受け取る。
  • 監視エージェント: 複数のプロセスが個別に死活監視を行い、異常を検知した瞬間に、中央管理プロセスへレジストリを介して「警報」を飛ばす。

終わりに:技術は「枯れる」のではない

VBScriptを「古い」と断じるのは簡単だ。しかし、この環境で極限の最適化を突き詰めることは、プログラミングの基礎体力、すなわち「OSがどのようにメモリを管理し、どのようにI/Oを処理しているか」を理解することに他ならない。

この記事を読んだ諸君には、APIの深淵を覗き、環境の制限を言い訳にせず、与えられたリソースの中で「最速」を叩き出すエンジニアであってほしい。

さあ、コードを書いて、この沈黙したレジストリに命を吹き込め。

タイトルとURLをコピーしました