EternalWindows
MSI データベース編 / テーブルとレコード

作成したMSIファイルを後日修正したくなった場合、 再びインストーラーを開いて新しいMSIファイルを作成するのは大変な作業です。 MSIファイルにはインストールに関する情報が含まれているわけですから、 修正したい情報のみを適切に取り出し、それを新しい値に更新すれば、 その情報はインストールの際に正しく反映されることになるでしょう。 MSIのデータベース関数を呼び出せばこれらの編集作業を行うことができますが、 まずは、Orcaという既存の編集ツールの使い方を学習し、それと同時にMSIファイルの核となる テーブルとレコードという概念をしっかりと理解してくことにしましょう。

Microsoftが公開しているPlatform SDKには、Orca.msiというMSIファイルが含まれています。 このファイルをインストールした場合、Orca.exeという実行ファイルが作成されますから、 これを起動して、編集したいMSIファイルをオープンするか、 MSIファイルを右クリックして Edit Width Orca で選択してください。 また、OrcaはWindows Installer SDKというSDKにも含まれていますから、 Orcaのみをインストール目的とする場合は、サイズ量の大きいPlatform SDKではなく、 Windows Installer SDKの方をダウンロードするとよいでしょう。 Windows Installer SDKをダウロードするとIntelSDK.msiが作成されますから、 これをインストールして作成されるMsiIntel.SDKフォルダをオープンし、 ToolsフォルダにあるOrca.msiを実行してください。 Windows Installer SDKのダウンロードページは、下記の通りです。

http://www.microsoft.com/downloads/details.aspx?FamilyID=E96F8ABC-62C3-4CC3-93AD-BFC98E3AE4A3&displaylang=en

Orcaの外観は、左側にテーブル用のリストビューが表示され、 右側にテーブルの中身であるレコードがリストビューで表示されることになっています。 テーブルとは、ある1つの系統に関するデータをまとめたもので、 たとえば、Dialogというテーブルにはインストールの際に表示されるダイアログに関する データを含んでいることになります。 このデータというのはダイアログの例であれば、表示されるダイアログごとに存在し、 各々のデータはレコードという単位で扱われることになります。 レコードは、フィールドと呼ばれる属性を維持しており、 Dialogテーブルのレコードであれば、ダイアログの幅やタイトルなどのフィールドを含んでいます。 次の図は、Visual Studioのセットアッププロジェクトで作成したMSIファイルを開いたもので、 Dialogテーブルを選択しています。

先に述べたように個々のデータはレコードとして扱われ、 それは右側のリストビューの各々の行に相当します。 つまり、上図の例であれば、この行の数だけがダイアログが存在することを意味します。 Dialogテーブルの1つ目のフィールド(列)のカラムはDialogとなっており、 ここにはMSIファイルにおいてダイアログを識別する名前を指定することになっています。 現在選択しているレコードの1つ目のフィールドは、SelectFolderDialogとなっているため、 恐らくこのレコードは、フォルダ選択ダイアログのデータを表すものと推測できます。 したがって、たとえば7つ目のフィールドの「フォルダの参照」という文字列を ダブルクリックして自作の文字列に書き換えてファイルを保存したならば、 インストールの際に表示されるフォルダ選択ダイアログのタイトルは、 書き換えた自作の文字列が表示されることになるはずです。 ちなみに、[ ]で挟まれた文字列はPropertyテーブルへの参照という意味合いを持ち、 [ ]内の文字列を持つレコードの2番目のフィールドの値がインストール時に適応されます。

ProductNameというフィールド値を持つレコードの2番目のフィールドは、 Setup1となっているため、この値を書き換えれば[ProductName]を指定している 全てのフィールド値を間接的に書き換えたのと同じ意味を持ちます。

先に示したDialogテーブルやPropertyテーブルには、 1つ目のフィールド値がそのレコードを識別する役割を果たしていましたが、 このようなフィールドはプライマリキーと呼ばれることがあります。 プライマリキーは各レコードにおいて決して重複してはならず、 それは他のテーブルのレコードのフィールドにおいて外部キーとして利用されることになります。 次に、例を示します。

Controlテーブルには、ダイアログに貼り付けられるコントロールの情報が格納されます。 Dialog_で示される1つ目のフィールドは、貼り付け対象のダイアログを識別する名前を指定するのですが、 ここには先に示したDialogテーブルの1つ目のフィールドに指定されていた SelectFolderDialog等の名前のみを指定するべきです。 これは、存在しないダイアログにコントロールを貼り付けるという矛盾が起きないためです。 このように、他のレコードのプライマリキーを必ず指定しなければならないフィールドは 外部キーと呼ばれ、カラムの名前の終端には_がつくようになっています。 また、先ほどプライマリキーは重複してはならないと述べましたが、 上図のように外部キーが利用される場合には例外があります。 Controlという2つ目のフィールドは、コントロールを識別する名前を指定するのですが、 それは1つ目のフィールドで示されるダイアログ内のみで一意であればよく、 他のダイアログであればその名前を重複しても構わないのです。

MSIファイルの解析は、単に編集目的ではなく、MSIの概要を知るためにも非常に有用な方法です。 しかし、解析のためには多くのテーブルとそのテーブルのカラムの意味を理解しなければならず、 この情報がマイクロソフトのリファレンスのどの部分に書かれているのかを見つけるだけでも困難です。 下記のURLには、MSIファイルが取り得る全てのテーブルについて記載されているため、 必要に応じて参照するようにしてください。

http://msdn2.microsoft.com/en-us/library/aa368259.aspx

これまでのテーブルやレコード、データベースといった言葉から、 MSIファイルへのアクセスはSQL言語で行えるのでは思われた方がいるかもしれませんが、 その予想は当たっているといえます。 厳密には、MSI関数に指定するテーブルへの照会文字列がSQLの形に即しているだけで、 ODBCドライバやデータベースに接続といった概念は全くないのですが、 SQLの知識があれば関数の内容を理解しやすくなるのは間違いありません。


戻る