在安装中包含 Cabinet 文件

本部分介绍在安装中包含 cabinet 文件。 有关详细信息,请参阅使用 Cabinet 和压缩源

在安装程序包中包含 cabinet 文件

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