Windows InstallerはCOMのインターフェースを持っていて、WSHでMSIファイル内のテーブルを読み込むことができます。JScriptで製品バージョンを取得してみます。
var databasePath = "TestProduct.msi";
var query = "SELECT `Value` FROM `Property` WHERE Property.Property='ProductVersion'";
var msiOpenDatabaseModeReadOnly = 0;
//
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(databasePath, msiOpenDatabaseModeReadOnly);
var view = database.OpenView(query);
view.Execute();
var record = view.Fetch();
WScript.echo(record.StringData(1));
また、Inno SetupでもCOMを扱えるので、外部に置いたMSIファイルのバージョンを取得することができます。これはInno SetupをMSIのセットアップランチャーとして使う時に役に立つでしょう。
まず、変数を宣言し、
var
installer, database, view, rec: Variant;
下記のコードでバージョンを取得します。
installer := CreateOleObject('WindowsInstaller.Installer');
database := installer.OpenDatabase('TestProduct.msi', 0);
view := database.OpenView('SELECT `Value` FROM `Property` WHERE Property.Property=''ProductVersion''');
view.Execute();
rec := view.Fetch();
MsgBox(rec.StringData(1), mbInformation, MB_OK);
OpenView()
関数に与えるSQL文を変えれば、あらゆるテーブルの値を取得することができます。業務用途のために信頼性を上げるなら、例外処理を追加した方が良いです。
この関数で使えるSQL文の文法は、MSDNライブラリの「SQL Syntax」を、使用例は「Examples of Database Queries Using SQL and Script」を参照してください。