キャビネット ファイルをインストールに含む
このセクションでは、インストールにキャビネット ファイルを含める方法について説明します。 詳細については、キャビネットと圧縮ソースの使用を参照してください。
キャビネット ファイルをインストール パッケージに含めるには
- キャビネット作成ツールを使用して、ソース ファイルをキャビネット ファイルに圧縮します。 「 Cabinet Files を参照してください。
- キャビネット ファイルは、.msi ファイル内のデータ ストリームに配置するか、ディレクトリ テーブルで指定されたソース ツリーのルートにある別のキャビネット ファイルに配置する必要があります。
- ソースが圧縮型であるか、圧縮されていないファイルと圧縮されたファイルの両方を含む混合型であるかを判断します。 「圧縮されていなるソースと圧縮されていないソース」を参照してください。 ソース イメージの種類に応じて、Word Count Summary プロパティの圧縮フラグ ビットまたは非圧縮フラグ ビットを設定します。
- キャビネット内の各ファイルの ファイル テーブル にレコードを追加します。 [ファイル] 列に、キャビネット内のファイルのファイル キーと正確に一致するファイル キーを入力します。 ファイル キーは大文字と小文字が区別されます。 ファイル テーブルとキャビネットのファイル インストール シーケンスも同じである必要があります。 ファイル シーケンスは、[シーケンス] 列のシーケンス番号で指定します。 キャビネット内の最初のファイルのシーケンス番号に到達するには、次の操作を行います。 [DiskID] 列で最大の値を持つメディア テーブルで既存のレコードを検索します。 このレコードの [LastSequence] フィールドは、メディアで使用される最後のファイル シーケンス番号を示します。 ファイル テーブルで、新しいキャビネットの最初のファイルに、これより大きいシーケンス番号を割り当てます。 残りのすべてのファイルに、キャビネット ファイルと同じ順序でシーケンス番号を割り当てます。 残りのレコード フィールドの説明については、「ファイル テーブル」を参照してください。
- キャビネットのメディア テーブルにレコードを追加します。 この新しいレコードの [DiskID] フィールドに、テーブルに既に存在する最大の DiskID 値より大きい値を指定します。 キャビネットの名前を [キャビネット] フィールドに入力します。 この名前は、Cabinet データ型の形式である必要があります。 キャビネットが.msi ファイルに格納されているデータ ストリームである場合は、名前の先頭に数字記号 "#" を付けます。 キャビネットがデータ ストリームの場合、キャビネットの名前では大文字と小文字が区別されることに注意してください。 キャビネットが別のファイルの場合、ファイルの名前では大文字と小文字は区別されません。
- 更新されたファイル テーブルのシーケンス列をチェックして、新しいキャビネット内の最大のファイル シーケンス番号を確認します。 メディア テーブルの新しいレコードの [LastSequence] フィールドに、これより大きい値を入力します。 残りのレコード フィールドの説明については、「メディア テーブル」を参照してください。
- Msidb.exe などのツールを使用するか、インストーラーのデータベース関数を使用して、キャビネット ファイルをインストール パッケージに格納できます。 次の 4 つの手順では、データベース関数を使用してプログラムからキャビネットを追加する方法について説明します。
- プログラムからインストール パッケージにキャビネットを追加するには、MsiDatabaseOpenView を使用して、データベースの _Streams テーブルのビューを開きます。
- MsiRecordSetString を使用して、_Streams テーブルの [Name] 列に、メディア テーブルの [キャビネット] 列に表示される名前を設定。 番号記号 # を省略します。
- MsiRecordSetStream を使用して、_Streams テーブルの [データ] 列をキャビネットのデータに設定します。
- MsiViewModify を使用して、_Streams テーブル内のレコードを更新します。
- Msidb.exe を使用してキャビネット ファイル Mycab.cab を Mydatabase.msi という名前のインストール パッケージに追加するには、次のコマンド ラインを使用します: Msidb.exe -d mydatabase.msi -a mycab.cab。 この場合、Media テーブルの [キャビネット] 列には、文字列 #mycab.cab が含まれている必要があります。