将外部 CAB 添加到具有内部 CAB 的 MSI

Adding an external CAB to an MSI with an internal one

我有一个 visual studio 安装程序 (vs2015) 可以安装应用程序。我希望它还安装一组配置文件,其内容因物理安装位置而异,将作为 cab 文件交付到与 msi 相同的目录中。 cab 有一组已知的文件,这些文件将分布在安装位置的 2 个文件夹中,并且由与安装程序不同的项目创建。如何让 msi 安装其内部内容和外部 cabinet 文件的内容?

不清楚你的意思,但你不能改变 MSI 来解压你单独的 CAB 中的所有文件,就像它们在 MSI 中一样,就像其他文件一样。 MSI 文件、文件 table、组件 table 等文件中的文件内部数据过多。

因此,如果 CAB 文件与 MSI 文件位于同一位置,则您可以创建自定义操作以将其复制到目标系统,并根据需要解压缩。可以使用 [SourceDir] 属性 或 [OriginalDatabase] 属性 OriginalDatabase property

告诉副本 MSI 位置在哪里

您将解析该位置以获取路径,然后复制到 TARGETDIR 位置。

Wise Package Studio

我实际上成功地用新文件更新了 MSI 文件,以便在当天使用 Wise Package Studio 安装。它向 Cabs table 添加了一个 CAB 文件(我不知道这个 table 实际上是一个 Wise "view" 还是一个真正的 MSI table - 它似乎从 Orca 中丢失,如果所有 CAB 都嵌入在 MSI 中)。 Media table 中有一个相应的条目,其中 LastSequence 值(在媒体 table 中)描述了哪个 CAB 包含哪些文件。在文件 table 中,您会找到一个名为 Sequence 的字段,它指定列出的文件的 "order"。本质上,您的新文件将位于 "order" 的末尾,因此位于新的 CAB 中。有点牵强。

但是,我成功地让 Wise Package Studio 嵌入了新的 CAB 文件,并在安装过程中使用外部 CAB 文件来安装新文件,但我没有记录该过程,也不记得了所有的步骤。此外我不推荐这个过程 - 事实上我现在永远不会使用这种方法。它只是在我当时工作的地方使用。 在大多数情况下,我们使用转换将此内容添加到主包中,而不是破解 MSI 本身


MSI SDK:在安装中包含一个 Cabinet 文件

将 CAB 文件添加到 MSI 的过程记录在 MSI SDK 中:Including a Cabinet File in an Installation。相当投入——正如我所说,但绝对有可能。如您所见,媒体中 CAB 名称开头缺少 # 标志 table 表示外部 CAB 文件。

所以我想,简而言之:

  1. 向文件添加一个新条目table,将序列号设置为从已有的最高序列文件条目开始的+1。我也会在 Component table 中添加一个新的对应条目。
  2. Media table 添加新行,在 LastSequence 列中指定您为文件设置的编号。将 cabinet 文件的名称添加到 Cabinet。确保 CAB 名称没有前缀 #.
  3. Wise 还会在 MsiFileHash table 中添加条目。不确定这是否是必需的。很确定这里不需要添加条目。
  4. 正如您将在链接的 MSI SDK 文章中看到的那样,您可以按照链接的 MSDN 内容中列出的最后几个步骤嵌入整个 cab。

我希望我有时间测试所有这些,但我没有。这让我想到了下一点:


默认/实例化您的设置?

当我看到这样的问题时,我总是会问自己:这些文件中有什么?它们 "trivial settings" 实际上可以默认设置而不是硬编码在配置中吗?文件?这为我节省了很多工作,很多次。

设置和数据文件的部署一直是 MSI 和旧式安装程序的问题。我对此类文件的部署理念是将安装的内容视为 "read-only" 然后将它们复制到每个用户的位置或在应用程序启动时在 HKCU 中设置它们,使用一些获取适当值的合理过程(从写入的设置在安装期间到 HKLM,从用户那里检索,从互联网上检索,等等......)。请参阅有关该主题的更长答案:Create folder and file on Current user profile, from Admin Profile。在我看来,最好的方法是在启动时从在线数据库中检索设置(如果您阅读该链接的内容,您将会看到),但这涉及到。