在安装中包含 Cabinet 文件
本部分介绍在安装中包含 cabinet 文件。 有关详细信息,请参阅使用 Cabinet 和压缩源。
在安装程序包中包含 cabinet 文件
- 使用 cabinet 创建工具将源文件压缩到 cabinet 文件中。 请参阅 Cabinet 文件。
- cabinet 文件必须位于.msi 文件内的数据流中,或者位于 Directory 表指定的源树根目录的单独 cabinet 文件中。
- 确定源是压缩类型还是包含未压缩文件和压缩文件的混合类型。 请参阅压缩和未压缩源。 根据源图像的类型,设置 Word Count Summary 属性的压缩或未压缩标志位。
- 将记录添加到 cabinet 中每个文件的 File 表中。 在“文件”列中输入文件密钥,该密钥与 cabinet 中文件的文件密钥完全匹配。 文件密钥区分大小写。 File 表和 cabinet 中的文件安装顺序也必须相同。 文件序列由“序列”列中的序列号指定。 若要到达 cabinet 中第一个文件的序列号,请执行以下操作。 在 DiskID 列中查找 Media 表中包含最大值的现有记录。 此记录的 LastSequence 字段提供媒体上使用的最后一个文件序列号。 在 File 表中,为新 cabinet 的第一个文件分配一个大于此值的序列号。 按与 cabinet 文件中相同的顺序将序列号分配给所有剩余文件。 有关剩余记录字段的说明,请参阅 File 表。
- 将记录添加到 cabinet 的 Media 表。 在此新记录的 DiskID 字段中指定一个值,该值大于表中已存在的最大 DiskID 值。 将 cabinet 的名称放入 Cabinet 字段。 此名称必须采用 Cabinet 数据类型的形式。 如果 cabinet 是存储在 .msi 文件中的数据流,则为名称加上数字符号“#”前缀。 请注意,如果 cabinet 是数据流,则 cabinet 的名称区分大小写。 如果 cabinet 是单独的文件,则文件的名称不区分大小写。
- 通过检查更新的 File 表的“序列”列来确定新 cabinet 中最大的文件序列号。 在 Media 表的新记录的 LastSequence 字段中输入大于此值的值。 有关剩余记录字段的说明,请参阅 Media 表。
- 可以使用 Msidb.exe 等工具或使用安装程序的数据库函数将 cabinet 文件存储在安装程序包中。 以下四个步骤说明如何使用数据库函数从程序中添加 cabinet。
- 若要从程序中将 cabinet 添加到安装程序包,请使用 MsiDatabaseOpenView 在数据库的 _Streams 表上打开视图。
- 使用 MsiRecordSetString 将 _Streams 表的“名称”列设置为 Media 表的“Cabinet”列中显示的名称。 省略数字符号:#。
- 使用 MsiRecordSetStream 将 _Streams 表的“数据”列设置为 cabinet 的数据。
- 使用 MsiViewModify 更新 _Streams 表中的记录。
- 若要使用 Msidb.exe 将 cabinet 文件 Mycab.cab 添加到名为 Mydatabase.msi 的安装程序包,请使用以下命令行:Msidb.exe -d mydatabase.msi -a mycab.cab。 在这种情况下,Media 表的“Cabinet”列应包含字符串:#mycab.cab。