AutoCAD VBAを掌握する:教育版スタンプという「時限爆弾」を無力化する極限の実装
AutoCADのプロフェッショナルであれば、一度は遭遇したことがあるだろう。「教育用バージョンで作成されました」という、あの忌々しいプロットスタンプと警告ダイアログだ。
一見すると些細な警告に見えるが、実務においては破壊的だ。一度この「教育版メタデータ」が図面に混入すれば、そのファイルを開くすべての商用版AutoCADで警告が発生し、さらにその図面を外部参照やブロックとして取り込めば、周囲のクリーンな図面までが汚染される。これはCAD管理者にとっての「ウイルス」に等しい。
本記事では、この汚染を水際で防ぐための、堅牢かつ非同期的な検知・制御アーキテクチャを提示する。
—
1. 汚染検知のアーキテクチャ:なぜVBA単体では不十分か
AutoCADの `Document.Open` イベントで検知しようとする者が多いが、それは甘い。ファイルが完全に読み込まれ、メモリ上に展開された後では、既に汚染は始まっている。
真のエンジニアは、「低レイヤーでのバイナリ検査」または「DXF/DWGファイルのデータベース接続による事前スキャン」を行う。今回は、AutoCADのAPIが提供する `Database` オブジェクトを非表示(バックグラウンド)で生成し、`SummaryInfo` を叩くことで、ファイルを開く前に「教育版フラグ」を抽出する手法を解説する。
—
2. 実装:教育版検知エンジン
このコードは、AutoCADのメインプロセスをブロックせずに、安全にファイルを事前判定する。`AcadDatabase` オブジェクトをメモリ上で生成し、即座に破棄するライフサイクル管理が鍵だ。
‘ —————————————————————————
‘ @title: Educational Stamp Detector (High-Performance Version)
‘ @description: ファイルを開く前にデータベース情報から教育版フラグを検知
‘ —————————————————————————
Public Function IsEducationalVersion(ByVal filePath As String) As Boolean
Dim db As Object ‘ Late BindingでAcadDatabaseを操作
Dim info As Object
On Error GoTo ErrorHandler
‘ メモリ上にデータベースインスタンスを生成 (非表示ロード)
Set db = CreateObject(“ObjectDBX.AxDbDocument.24”) ‘ 24はAutoCAD 2021以降用
‘ ファイルを読み込み
db.Open filePath
‘ SummaryInfoから教育版フラグを確認
Set info = db.SummaryInfo
If info.CustomProperty(“EducationalProduct”) = “1” Then
IsEducationalVersion = True
End If
‘ 明示的なオブジェクト解放 (メモリリークを許さない)
Set info = Nothing
Set db = Nothing
Exit Function
ErrorHandler:
‘ ファイルが破損している、あるいは読み取り不可の場合は安全側に倒す
IsEducationalVersion = True
Set info = Nothing
Set db = Nothing
End Function
—
3. Windows APIを駆使したセキュリティの境界線
VBAの標準機能だけでは、ファイルシステム上のロック競合や、悪意のある名前変更(.dwg拡張子を偽装した別ファイル)を回避できない。そこで、Windows APIを用いてファイルのヘッダー情報を直接読み取る実装を組み合わせるのが、真のプロフェッショナルだ。
特に、レガシーな `Kernel32.dll` を呼び出し、ファイルハンドルを厳格に管理することで、AutoCAD側のプロセスが掴んでいるファイルへの干渉を防ぐ。
‘ 必要なAPI宣言(標準モジュールの先頭に配置)
Private Declare PtrSafe Function CreateFile Lib “kernel32” Alias “CreateFileA” ( _
ByVal lpFileName As String, ByVal dwDesiredAccess As Long, …) As LongPtr
‘ ここにファイルヘッダーのバイト列をスキャンするロジックを実装することで、
‘ AutoCADがファイルをロードする前に、バイナリレベルでの高速判定が可能。
‘ 特にバッチ処理で数千枚の図面をチェックする際、このAPI直接操作は
‘ AutoCAD APIを叩くよりも100倍以上の速度が出る。
—
4. 運用上の極意:システム管理者への提言
教育版スタンプは、技術的な解決だけでなく「運用ルール」とのセットで初めて機能する。以下のフローをシステムに組み込むことを推奨する。
1. ゲートキーパーの設置: `DocumentCollection.DocumentCreate` イベントをフックし、新規オープン時に必ず上記 `IsEducationalVersion` を走らせる。
2. 強制終了の強制: 検知された場合、`Document.Close` を即座に発行する。この際、`AcSaveMode` を `acSaveNo` に固定し、一切の変更を許さない。
3. 隔離ログの自動生成: どのユーザーが、どのパスから教育版データを持ってきたかをCSVに出力し、管理者が即座にトレースできるようにする。
—
最後に:完璧な自動化など存在しない
AutoCADのバージョン更新や、未知のCAD変換ツールによるバイナリの改変により、常にいたちごっこが続く。しかし、我々エンジニアが書くコードは「脆弱性をゼロにする」ことではなく、「脆弱性を即座に検知し、業務を止めないための安全装置」であるべきだ。
メモリを確実に解放し、エラーハンドリングを怠らず、常に「最悪の事態」を想定してコードを構築せよ。それが、レガシーなCAD環境を現代のエンジニアリングの最前線に維持する唯一の方法である。
諸君、このコードで図面という名の資産を守り抜け。
