VBScriptの亡霊を飼い慣らす:HTA動的生成による「極限の例外ハンドリング」
VBScriptは、もはや「過去の遺物」などではない。レガシーシステムの深淵で、今なおOSの挙動を直接制御する強力な武器だ。だが、多くの現場でこの言語が忌み嫌われる理由は一つ。「エラーが起きた後の無力さ」にある。
標準の `MsgBox` で表示されるエラーコードは、現場の混乱を助長するだけだ。例外発生時にスタック情報を握り潰すことは、エンジニアの冒涜に等しい。今日は、VBScriptの限界を突破し、動的HTA(HTML Application)を生成して「現代的なエラーUI」を即座に構築する、アーキテクトのための奥義を授ける。
—
1. なぜ「動的HTA」なのか
WSH(Windows Script Host)の標準出力や `MsgBox` は、複雑なオブジェクトの状態やスタックトレースを視覚化するにはあまりに貧弱だ。HTAであれば、DOMを操作し、CSSでスタイリングし、さらには `ActiveXObject(“Scripting.FileSystemObject”)` を通じてエラーログの永続化も容易に行える。
重要なのは、「メインのスクリプトが死ぬ直前に、独立したプロセスとしてGUIを立ち上げる」という設計思想だ。
2. 極限の例外ハンドリング実装
このコードは、予期せぬエラーを捕捉し、その瞬間にHTAファイルを一時フォルダへ生成・実行し、即座にメインプロセスをクリーンアップして終了する設計となっている。
‘ エラーハンドラの中核ロジック
Sub RaiseFatalError(errObj)
Dim fso, ts, tempPath, htaPath
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 一時パスの生成
tempPath = fso.GetSpecialFolder(2).Path
htaPath = fso.BuildPath(tempPath, “error_dump.hta”)
‘ HTAのテンプレート(動的生成)
Dim htmlContent
htmlContent = “
“
“
“
Critical Error Occurred
” & _
“
Source: ” & errObj.Source & “
” & _
“
Description: ” & errObj.Description & “
” & _
“”
‘ HTAファイルの書き出し
Set ts = fso.CreateTextFile(htaPath, True)
ts.Write htmlContent
ts.Close
‘ 外部プロセスとしてHTAを起動
Dim shell
Set shell = CreateObject(“WScript.Shell”)
shell.Run “mshta.exe ” & htaPath, 1, False
‘ オブジェクトの明示的解放(メモリリークを許すな)
Set shell = Nothing
Set ts = Nothing
Set fso = Nothing
WScript.Quit 1
End Sub
‘ 使用例
On Error Resume Next
‘ 故意の例外発生
Dim x : x = 1 / 0
If Err.Number <> 0 Then
RaiseFatalError Err
End If
—
3. アーキテクトが意識すべき「裏側の真実」
この手法を実装する際、留意すべき技術的負債と最適化のポイントがある。
- プロセス分離の重要性:
`WScript.Shell` の `Run` メソッドでHTAを起動する際、第3引数を `False` にしている。これにより、メインのVBScriptが終了しても、エラー表示ウィンドウは独立して生き残る。これはクラッシュダンプとしてのUIを維持するために必須だ。
- メモリ解放の規律:
VBScriptのガベージコレクションを信用してはいけない。`Set obj = Nothing` を怠ることは、レガシー環境におけるメモリリークの最大の要因だ。特にCOMオブジェクトのハンドラを破棄せずに終了すると、OS側にゾンビプロセスが残る可能性がある。
- 権限の壁:
HTAはIEベースのエンジンを流用するため、セキュリティ制限を受ける。社内システムであれば、GPOで「信頼済みサイト」にHTAが動作するパスを指定しておくか、あるいはHTAの `HTA:APPLICATION` タグ内で `applicationName` を適切に設定し、信頼レベルを制御せよ。
4. 最後に:技術は「仕組み」に宿る
「VBScriptだからエラー表示は質素で構わない」という考えは、保守の放棄に等しい。エラーが起きた時こそ、システムはその設計者の品格を問われる。
今回紹介したHTA動的生成は、単なるUIの装飾ではない。複雑な業務ロジックの中で、「何が起きたのか」を追跡可能にするための、アーキテクチャの防波堤である。
レガシーな環境であっても、最高のエンジニアリングを適用せよ。それが我々のような「自動化の番人」に課せられた責務だ。コードを書き終えたら、必ず `Nothing` を代入することを忘れるな。それが、システムを愛する者の流儀だ。
