Msiファイルとキャビネットファイルの関係


■キャビネットファイルとは?

キャビネットファイル(以下Cabファイルと略す)は圧縮ファイルの一種です。拡張子はcab です。細かいことを言うと、圧縮形式によって更にMSZIP方式とLZX21形式に分けられます。

一般的に圧縮ファイルを解凍するためには、アーカイバと呼ばれる解凍ソフトが必要ですが、Cabファイルに関しては、Windows標準の機能だけで中身を閲覧したり抽出したりすることができます。もちろん特定のアーカイバに関連付けて扱うこともできます。

■Msiファイルとは?

【Windows インストーラ】というWindows純正のインストール形式において、中心的な役割を果たすファイルです。拡張子はmsi です。

アイコンは、こんな画像です。

MSIアイコン

ちなみに、下のようなアイコンのSetup.exe と組み合わされて配布されていることも多いと思います。これは、OSや【Windows インストーラ】のバージョンの差異に伴う弊害を吸収しつつ、適切にMsiファイルを呼び出す、フロントエンドの役目を果たします。

SetUpのアイコン

Msiファイルはインストーラですから、インストールの際には、必要なファイルをインストール先に展開したり、システムフォルダにファイルを作ったり、レジストリに設定を記録したり、環境変数にパスを通すなどの環境設定を行ったりします。(すべてのインストーラが、これらのことを全て行うわけではありません。)

■Msiファイルの分類

展開するファイルをどのように保持しているかにより、Msiファイルを分類することができます。Msiファイルの中にCabファイルを包含する内包型と、Msiファイル自体の中にはCabファイルを含まずに、外部に存在するCabファイルを外から命令して展開するようにしながらインストールをする外部リンク型に分類できるのです。また、一部のCabファイルは自分自身で内包し、他の部分は外部Cabファイルにする混合型にすることも可能です。

内包型 外部リンク型
混合型

Msiの分類 特徴
内包型 内部にCabファイルを包含しており、インストール時にそれらを展開してインストールする
外部リンク型 外部のCabファイルから抽出したファイル群を、適切な場所に配置してインストールする
混合型 一部のCabファイルを内包し、その他の外部Cabファイルとも連携してインストールを行う

(*分類名は、私が勝手に名付けた物で、正式な名称ではありません。)

内包型のMsiファイルは、一種の自己解凍型Cabファイル(SFX)と言えます。実行(インストール)すれば、ユーザーが特定のアーカイバを用意しておかなくても中身が解凍される訳ですから。(正しくは【Windows インストーラ】が必要なのだが、最初からWindowsに入っているのでユーザーが意識しないで使えてしまう。)

外部リンク型のMsiファイルは、インストール情報のデータベースで、インストール時の「ああしろ!、こうしろ!」という命令が詰まっているものに過ぎないと考えれば、理解しやすいでしょう。

■内包型と外部リンク型のデータベースの違い

内包型でも外部リンク型でも見た目は同じ1つのMsiファイルに見えます。それでは【Windows インストーラ】は、どこをみて、Msiファイルが内包型なのかそれとも外部リンク型なのかを区別しているのでしょう? 実はこの情報は、Msiファイルのデータベースの中にきちんと書かれているのです。

Microsoft純正ソフトである【Orca】を使って、Msiファイルの中をのぞいて見ましょう。(【Orca】については別の章で解説します。)

下図が内包型のMsiファイルを【Orca】で開いた画面の一例です。Cabファイルの情報はMedia というTableCabinet という欄に保存されています。内包型の場合は要素の先頭に#を付けるという規約になっています。

下の画面の例では、12個の内包型Cabファイルを持っていることがわかります。拡張子は、この例のようにcab とは限りません。拡張子の無い場合もあります。

Orca(内包型)

次に、外部リンク型の例を見てみましょう。

Orca(外部リンク型)

外部リンク型の場合は、Cabinet要素の先頭に#が付いていません。この例では、Data1.cab という外部のファイルと連携しつつ、インストールを行うタイプだとわかります。

すなわち、Media というTable のCabinet欄において、先頭に#が付いたものだけであれば内包型、#が付かないものだけであれば外部リンク型、両方が混在していれば混合型ということになります。

【MSI2FILE】は、MsiファイルからCabファイルを抽出して解凍するソフトです。したがって、Cabファイルを持たない外部リンク型には対応していません。と言うか、使う必要がないと言うべきでしょう。外部リンク型の場合は、最初からcabファイルが目に見える形で存在しているので、それを普通のアーカイバで解凍すればよいのです。