创作合并模块 Directory 表

可以将合并模块应用于 .msi 文件以将目录添加到安装中,但此操作无法替换或删除任何现有目录。 Directory 表指定合并模块为目标安装提供的目录布局。 每个合并模块都需要一个 Directory 表。

在合并模块中创作 Directory 表时,请遵循以下准则。 有关详细信息,请参阅 Directory 表使用 Directory 表

  • 合并模块添加的目录结构只能有一个根目录。 根目录必须命名为 TARGETDIR。 用户可以在合并期间更改 TARGETDIR 的值,以指定要将模块的目录结构附加到目标目录树中的哪个位置。

  • 除 Directory 表之外的合并模块表不能直接引用 TARGETDIR 作为目录位置。 如果用户更改了 TARGETDIR 的值,则此类引用的位置将会更改。

  • 合并模块中的表必须引用 TARGETDIR 的子目录的位置,或引用合并模块树中的另一个目录的位置。 执行以下操作以将 TARGETDIR 指定为合并模块中某个目录的父级。 在 Directory 列中输入该目录,在 Directory_Parent 列中输入 TARGETDIR。 在 DefaultDir 列中使用“.”表示法来指示此目录位于不含子目录的 TARGETDIR 中。 有关详细信息,请参阅使用 Directory 表

  • 合并模块添加的目录的名称必须采用为合并模块数据库中的主键命名中所述的命名约定。 这包括由 SystemFolderProgramFilesFolder 等属性预定义的目录。

  • GUID 追加到 Directory 表中的每个条目(TARGETDIR 除外)。这包括指定 Windows Installer SystemFolder 属性的 Directory 表条目,例如,SystemFolder.00000000_0000_0000_0000_000000000000。 Mergemod.dll 库添加自定义操作以设置 SystemFolder 属性。

  • 当合并模块中包含预定义的目录时,合并工具会自动将自定义操作类型 51 添加到目标数据库。 合并模块作者还必须确保包含 CustomAction 表。 CustomAction 表可能是空的,但此表必须存在于目标数据库中,并确保将修改的预定义目录写入正确的位置。 例如,在合并模块中包含系统目录时,合并模块作者必须确保存在自定义操作表。

    请注意,用于生成这些类型 51 自定义操作的匹配算法只会检查目录名称是否以预定义的 SystemFolder 属性之一开头。 它不会验证目录名称是否完全与目录属性相同。 以这些标准文件夹名称之一开头的任何目录都将获得类型 51 自定义操作,即使名称的其余部分不是 GUID。 作者需要注意,这不会基于以 SystemFolder 属性之一开头的派生主键生成误报匹配项和意外的自定义操作。

下面是合并模块中的 Directory 表和预期的解析目录的示例。

Directory Directory_Parent DefaultDir
TARGETDIR   SourceDir
Dir00.BC82E350_ C7FC_11d1_ A848-006097ABDE17 TARGETDIR .:MMM_Prog
SystemFolder.BC82E350_ C7FC_11d1_ A848-006097ABDE17 TARGETDIR MMM_Sys
Dir02.BC82E350_ C7FC_11d1_ A848-006097ABDE17 Dir00.BC82E350_ C7FC_11d1_ A848_006097ABDE17 MFC_OCX

 

包含上述 Directory 表的合并模块预期会生成以下目录结构。

Directory 目标 Source
Dir00.BC82E350_ C7FC_11d1_ A848-006097ABDE17 [合并模块的安装点]\ [合并模块的源点]\MMM_Prog
SystemFolder.BC82E350_ C7FC_11d1_ A848-006097ABDE17 [SystemFolder]\ [合并模块的源点]\MMM_Sys
Dir02.BC82E350_ C7FC_11d1_ A848-006097ABDE17 [合并模块的安装点]\MFC_OCX [合并模块的源点]\MMM_Prog\MFC_OCX