EternalWindows
MSI カスタムアクション編 / シーケンスとアクション

MSIファイルによるインストールで行われる個々の動作は、 アクションと呼ばれる単位で区切られています。 インストールによって、ファイルが作成されたりレジストリ書き込みが行われるのは、 その動作を行うためのアクションがMSIによって実行されたからであり、 一連のアクションはシーケンスとしてMSIファイルに記述されています。 インストールが完了するのは、このシーケンス上の全てのアクションを実行し終えたときとなります。

シーケンスは、UIの表示を行うためのアクションを含むInstallUISequenceテーブルと、 実際にインストールを行うためのアクションを含むInstallExecuteSequenceテーブルに記述されます。 管理インストールやアドバタイズインストールの際にはまた別のテーブルが参照されますが、 ここでは通常のインストールを行うものとして話を進めていきます。 次の図は、Visual Studioのセットアッププロジェクトで作成したMSIファイルをOrcaで開いたものです。

このInstallUISequenceテーブルに限らず、 全てのシーケンステーブルはAction、Condition、Sequenceという3つのカラムで構成されます。 個々のレコードが1つのアクションに相当し、アクションの種類がActionカラム、 アクションを実行するかどうかの条件がConditionカラム、 そのアクションを実行する順番がSequenceカラムとなっています。 アクションはSequenceの値が低いものから順に実行されることになりますから、 上図の例であれば、ERRCA_UIANDADVERTISEDアクションが最初に実行され、 次にAppSearchアクションが実行されます。 また、InstallUISequenceテーブルでUIの表示に関わるアクションを実行を終えた後には、 InstallExecuteSequenceテーブルのアクションを実行しなければなりませんから、 InstallUISequenceテーブルにはExecuteActionというアクションが含まれています。

シーケンステーブルに記述される大抵のアクションは、標準アクションです。 簡単に述べると、インストールおいて必要であるとされる動作を行うアクションのことで、 MSIはそれらの動作内容を完全に把握しています。 たとえば、LaunchConditionsという起動条件に関する標準アクションがありますが、 このアクションをシーケンステーブルで発見したMSIは、LaunchConditionテーブルを調べ、 その内容を基にインストールを続行するかどうかの判定を行います。 このように標準アクションは、何らかのテーブルと関係し合うことが多く、 あるテーブルの内容が意味を持つかは、それに関係するアクションが実行されるかどうかに直結します。 つまり、LaunchConditionsという標準アクションが実行されなければ、 LaunchConditionテーブルにデータを設定いたとしても、それは考慮されないということです。 標準アクションがインストールに必要な動作を含むことから、 明示的にそれらをシーケンステーブル上から削除することは考えられませんが、 アクションの実行がテーブルの内容に依存しているという見方は重要です。

シーケンステーブルには、標準アクションとは異なる独自のアクション、 つまり、開発者が用意したカスタムアクションを記述することが可能となっています。 MSIがシーケンステーブルのActionカラムで標準でない名前を発見したとき、 その名前をキーとしてCustomActionテーブルにアクセスし、 そこに設定されているタイプに応じて適切な処理が行われます。 たとえば、EXEファイルを起動したり、DLLの特定の関数を呼び出したりします。 このEXEやDLLは開発者が用意するものですから、 それらに含まれるコードはインストーラーの動作を拡張する効果をもたらすといえます。 カスタムアクションの作成には、モジュール(EXEやDLL)の実装やシーケンステーブルの修正などの作業が必要であるため、 まずは追加したい機能が標準アクションで実現できないのかを検討しておくべきといえます。


戻る