EternalWindows
MSI インストール編 / MSIによるインストール

アプリケーションをインストールする方法として、 Window2000からはMSI(Microsoft Windows Installer)という標準が登場しました。 従来のインストールでは、ファイルの圧縮やレジストリ書き込み、ショートカットの作成など、 インストーラー用のソースを自分で記述しなければならなかったのに対して、 MSIではMSIファイルを作成することがインストーラーの作成に直結します。 MSIファイルの作成は、Windows Installerをサポートするツールで行うことが可能で、 特別なプログラム知識も必要としないことから、 開発に伴うコストの削減とインストール時における安全性を高めることができます。

従来のインストールといっても、それが総合的にMSIに劣っているというわけではありません。 Visual Studioのセットアッププロジェクト等によるMSIファイルの作成は基本的に複雑であり、 誤った設定を行ってしまうと、アンインストールの際に関係のないレジストリキーが 削除されてしまうという問題も発生することがあります。 現在では、MSIを利用しないインストールツールも数多く配布されており、 自分にとって使いやすいものを選択するのが一番であるといえるでしょう。 たとえば、ファイルを圧縮してそれをEXEファイルの中に組み込み、 インストールの際に展開先ディレクトリを表示するという目的を達成したいのであれば、 system32フォルダに存在するiexpress.exeを利用するのがよいと思われます。

アプリケーションの開発者にとって、MSIの知識が必要となる例はそれほど多いものではないと思われます。 MSIファイルを利用するのは、あくまで作成したファイルをインストールするためであり、 インストーラー作成ツールの使い方を理解すれば大抵はそれで十分だといえるでしょう。 しかし、MSIの関数についての知識はともかく、 少なくともMSIを利用することで次のような利点があることは知っておくべきといえます。

主な特徴 意味
確実なアンインストール インストールしたファイル群を、MSIファイルの右クリックメニューや 「プログラムの追加や削除」から確実にアンインストールすることができる。 MSIファイルの作成時にアンインストールのために特別な処理を行う必要がない。
アドバタイズインストール スタートメニューなどにショートカットのみをインストールしておき、 それがクリックされたときに残りのファイルをインストールすることができる。 このようなインストールは、アドバタイズインストールやオンデマンドインストールと呼ばれ、 実際に必要なった時点でファイルをインストールできることから、 インストール時間とメモリの節約を図れる。
デジタル署名 WindowsXPでバージョンアップしたWindows Installer2.0は、 MSIファイルにデジタル署名を加えることができる。 これにより、MSIファイルが改ざんされているかどうかを検出することができようになり、 安全性が高まった。
最新の機能をサポート MSIはWindowsの機能との統合性が高く、MSIファイルに指定できるテーブルを調整することで、 インストール中に様々なWindows機能を扱うことができる。 たとえば、Windows Installer 4.0では、 WindowsVistaの新機能であるUACやRestartManagerを扱うことができる。

MSIによるインストールの利点を見てきたところで、実際にどのような方法を 使ってインストールを行うのかを考えていきたいと思います。 既に述べてきたように、MSIではMSIファイルに書かれている情報を基にインストールを 行っており、このファイル自体にはmsiexec.exeというEXEファイルが関連付けられています。 このため、エクスプローラー上などから単純に.msiのファイルをダブルクリックすれば、 msiexec.exeが起動されインストールは開始されることになります。 この動作をプログラムから実現するとなった場合でも、 以下のように単純にmsiexec.exeを起動するコードを書けば済むことになります。

void InstallMsiFile(LPTSTR lpszFileName)
{
	TCHAR szParameters[256];

	wsprintf(szParameters, TEXT("/I %s"), lpszFileName);

	ShellExecute(NULL, NULL, TEXT("msiexec"), szParameters, NULL, SW_HIDE);
}

この例では、インストールオプションを/Iとしており、 これはファイルのインストールを意味します。 msiexec.exeに指定できるオプションを理解することで、 考えられるインストール作業の大抵は実現することができますが、 場合によってはmsi.dllの関数を直接呼び出したほうがよいこともあります。 たとえば、既存製品の製品コードを取得するmsi.dllの関数を呼び出し、 その製品コードを基に製品の調整を行いたいのであれば、ShellExecuteでmsiexec.exeを 起動するよりも、調整用の関数を呼び出した方が効率的であり、一貫性もあります。 実際のところ、msiexec.exe自体がインストール作業をmsi.dllの関数で行っていることから、 msi.dllの関数を理解することで、msiexec.exeのオプションについても理解しやすくなります。 しかし、このためにはまず、「製品」、「フィーチャ」、「コンポーネント」というMSI特有の 3つの重要な概念を理解しておかなければなりません。

製品というのは、いわばインストールすることになるアプリケーションフォルダ一式です。 これをMSIでは製品コードとして扱い、製品コードの形式はGUID形式となっています。 GUIDは、{XXXXXXXX-XXXX-XXXX-XXX-XXXXXXXXXXXX}という8-4-4-4-12の規則で一定の16進数値を取り、 1つのGUIDの値は他のGUIDと重複しないことが保障されています。 ただし、ここで少し注意しなければならないのは、MSI専用のレジストリにおいては、 製品コードがGUID形式で扱われていないという点です。 たとえば、次のような製品コードがあったとします。

{42630421-6158-261D-52A9-2A5C9B57D431}

この製品コードは、MSI専用のレジストリで次のように扱われているはずです。

124036248516D162259AA2C5B9754D13

一見するとこの文字列は、元のGUID形式の数値とは無関係のように思えますが、 実際にはGUID形式の数値をある法則にしたがって変換しているにすぎません。 注目すべきは、GUID形式がハイフンで区切られているというところで、 左から3つの文字列に関しては単純にそれらの並び方を反転し、 右2つの文字列に関しては2文字ずつ反転しているだけとなっています。 そして、後はハイフンを取り除いて個々の文字列を連結すれば完成となります。 この法則自体を理解しておく必要はありませんが、上記のような文字列を目にした場合は、 それがなんらかの製品を識別しているという見方は重要です。

フィーチャとは、インストールする機能を表す単位です。 製品をインストールする際には、全ての機能をインストールするのではなく、 自分にとって必要なものだけをインストールしたい場合がありますが、 MSIではこの作業をフィーチャのインストールと呼びます。 次の図は、Windows Installer SDKのMSIファイルを開いたものですが、 フィーチャの概念を非常に上手く利用しているので参考にしたいと思います。

このMSIファイルのユーザーインターフェースは、フィーチャをツリービューで階層形式に表示し、 ▼ボタンをクリックすることで、フィーチャのインストールの有無を決定することができます。 MSIファイルのFeatureテーブルを確認すれば、より一層フィーチャについての知識が得られます。

このテーブルの内容から、先のツリービューで表示された個々のツリーアイテムの名前が Titleというカラムを参照し、説明文がDescriptionというカラムを参照していることが分かります。 FeatureカラムはMSIファイル内部で識別するフィーチャ名で、Feature_Parentは親とするフィーチャ名です。 親のフィーチャをインストールしないときは、子のフィーチャもインストールされません。

最後にコンポーネントについてですが、これは実際にハードディスクに インストールされることになるファイル、もしくはレジストリに書き込まれる レジストリキーを表すものと考えて構いません。 1つのコンポーネントは1つのファイル、もしくはレジストリキーを表し、 それは関連されているフィーチャがインストールされることで 初めてディスクにインストールされたり、レジストリに書き込みが行われます。 つまり、1つのコンポーネントは1つのフィーチャに従属しており、 あるコンポーネントだけを明示的にインストールするということはできません。 フィーチャとコンポーネントの関係は、FeatureComponentsテーブルから確認できます。

このテーブルの中身をみれば、フィーチャにコンポーネントが関連付けられて いるということが確認できると思います。 単純に考えて、SDK_Databaseというフィーチャをインストールすることは、 ActionTe.XXXからUISample.msiまでのコンポーネントがインストールされる ことを意味しているだけです。 MSIファイルにおけるコンポーネント名は、上の例ではファイル名のようになっていますが、 実際にはそのようになっていないことが多いので注意してください。


戻る