组件表

组件表列出组件,并具有以下列。

类型 钥匙
元件 标识符 Y N
ComponentId GUID N Y
目录_ 标识符 N N
属性 整数 N N
条件 条件 N Y
KeyPath 标识符 N Y

组件

标识组件记录。

主表键。

ComponentId

此组件、版本和语言唯一的字符串 GUID。

请注意,这些 GUID 的字母必须为大写。 GUIDGEN 等实用工具可以生成包含小写字母的 GUID。 小写字母必须更改为大写,以使这些有效的组件代码 GUID。

如果此列为 null,安装程序不会注册组件,并且安装程序无法删除或修复组件。 如果仅在安装过程中需要组件,例如清理临时文件的自定义作或删除旧产品,则可能是有意执行此作。 将数据文件复制到不需要注册的用户的计算机时,也可能很有用。

Directory_

Directory 表中项的外部键。 这是一个属性名称,其值包含实际路径,可通过 AppSearch作 或从 Directory 表获取的默认设置来设置该路径。

开发人员必须避免创作将文件放入其中一个用户配置文件文件夹的组件。 这些文件在多用户情况下不适用于所有用户,并可能导致安装程序永久查看组件,因为需要修复。

目录表第一列的外部键。

属性

此列包含指定远程执行选项的位标志。 将指示位添加到列中的总值以包含选项。

注意

对于从 Web 位置下载的 .msi 文件,不应将属性标志设置为允许从源运行组件。 这是 Windows Installer 的限制,可以返回INSTALLSTATE_BADCONFIG的功能状态。

位标志
msidbComponentAttributesLocalOnly
0
0x0000
组件无法从源运行。 为属于某个功能的所有组件设置此位,以防止该功能从网络运行或从源运行。 请注意,如果某个功能没有组件,该功能始终以有效选项的形式显示从源运行和从 my-computer 运行。
msidbComponentAttributesSourceOnly
1
0x0001
组件只能从源运行。 为属于某个功能的所有组件设置此位,以防止该功能从 my-computer 运行。 请注意,如果某个功能没有组件,该功能始终以有效选项的形式显示从源运行和从 my-computer 运行。
msidbComponentAttributesOptional
2
0x0002
组件可以在本地运行,也可以从源运行。
msidbComponentAttributesRegistryKeyPath
4
0x0004
如果设置了此位,则 KeyPath 列中的值用作 注册表表中的键。 如果注册表表中相应记录的“值”字段为 null,则该记录中的“名称”字段不得包含“+”、“-”或“*”。 有关详细信息,请参阅 注册表表中“名称”字段的说明
对于写入 HKCU 配置单元的注册表项,建议设置此位。 这可确保安装程序在同一台计算机上有多个用户时写入必要的 HKCU 注册表项。
msidbComponentAttributesSharedDllRefCount
8
0x0008
如果设置了此位,安装程序会将组件的密钥文件的共享 DLL 注册表中的引用计数递增。 如果未设置此位,则仅当引用计数已存在时,安装程序才会递增引用计数。
msidbComponentAttributesPermanent
16
0x0010
如果设置了此位,安装程序不会在卸载期间删除组件。 安装程序在 Windows Installer 注册表设置中为组件注册额外的系统客户端。
msidbComponentAttributesODBCDataSource
32
0x0020
如果设置了此位,则 KeyPath 列中的值是 ODBCDataSource 表的键。
msidbComponentAttributesTransitive
64
0x0040
如果设置了此位,安装程序会在重新安装时重新评估 Condition 列中语句的值。 如果该值以前为 False 并且已更改为 True,安装程序将安装该组件。 如果该值以前为 True 并且已更改为 False,则即使组件具有其他产品作为客户端,安装程序也会删除该组件。
仅应为可传递组件设置此位。 请参阅使用可传递组件
msidbComponentAttributesNeverOverwrite
128
0x0080
如果设置了此位,则安装程序不会安装或重新安装组件(如果组件已存在密钥路径文件或密钥路径注册表项)。 应用程序会自行注册为组件的客户端。
仅将此标志用于注册表表注册的组件。 请勿将此标志用于由 AppId扩展ProgIdMIMEVerb 表注册的组件。
msidbComponentAttributes64bit
256
0x0100
将此位设置为将此标记为 64 位组件。 此属性有助于安装包含 32 位和 64 位组件的包。 如果未设置此位,则组件注册为 32 位组件。
如果这是替换 32 位组件的 64 位组件,请设置此位并在 ComponentId 列中分配新的 GUID。
msidbComponentAttributesDisableRegistryReflection
512
0x0200
将此位设置为禁用 注册表反射 受此组件影响的所有现有和新注册表项。 如果设置了此位,Windows Installer 将在组件访问的每个密钥上调用 RegDisableReflectionKey。 此位适用于 Windows Installer 版本 4.0。 32 位系统上忽略此位。 在 64 位版本的 Windows XP 上忽略此位。
注意: 在 64 位 Windows 仿真器(WOW64)上运行的 32 位 Windows 应用程序引用注册表视图与 64 位应用程序不同的视图。 注册表反射复制这两个注册表视图之间的一些注册表值。
msidbComponentAttributesUninstallOnSupersedence
1024
0x0400
为修补程序包中的组件设置此位,以防止在计算机上留下孤立组件。 如果安装了后续修补程序,则 使用 MsiPatchSequence 表中的 msidbPatchSequencesupersedeEarlier 值标记,以取代第一个修补程序,Windows Installer 4.5 及更高版本可以注销和卸载标记为 msidbComponentAttributesUninstallOnSupersedence 值的组件。 如果未将此组件标记为此位,则安装取代修补程序可能会在计算机上留下未使用的组件。
设置 MSIUNINSTALLSUPERSEDCOMPONENTS 属性与为所有组件设置此位的效果相同。
Windows Installer 4.0 及更早版本 不支持 msidbComponentAttributesUninstallOnSupersedence 值,并且将被忽略。

msidbComponentAttributesShared
2048
0x0800
如果在系统上安装至少一个包中标记了此属性值的组件,安装程序会将该组件视为所有包中的标记。 如果卸载共享已标记组件的包,则 Windows Installer 4.5 可以继续共享系统上组件的最高版本,即使卸载的包安装了该最高版本。
如果 DisableSharedComponent 策略设置为 1,则不会获取此位启用的共享组件功能。
Windows Installer 4.0 及更早版本 不支持 msidbComponentAttributesShared 值,并且将被忽略。

条件

此列包含一个条件语句,该语句可以控制组件是否已安装。 如果条件为 null 或计算结果为 true,则启用组件。 如果条件的计算结果为 False,则组件已禁用且未安装。

“条件”字段仅在 CostFinalize作期间启用或禁用组件。 若要在 CostFinalize 后启用或禁用组件,必须使用自定义作或 DoAction ControlEvent 来调用 MsiSetComponentState

请注意,除非为组件设置了 Attributes 列中的可传递位,否则即使条件列中的条件语句在产品的后续维护安装上计算结果为 False,组件也会保持启用状态。

Component 表中的“条件”列接受包含对已安装功能和组件的引用的条件表达式。 有关条件语句语法的信息,请参阅 条件语句语法

KeyPath

此值指向属于安装程序用来检测组件的组件的文件或文件夹。 两个组件不能共享相同的键路径值。 此列中的值也是 MsiGetComponentPath 函数返回的路径。

如果该值不为 null,则 KeyPath 是 注册表ODBCDataSource的主键,或者根据属性值 文件表。 如果 KeyPath 为 null,则Directory_列的文件夹用作键路径。

由于安装程序创建的文件夹在空时被删除,因此您必须将条目创作到 createFolder 表 才能安装包含空文件夹的组件。

请注意,如果 Windows Installer 组件包含由 Windows 资源保护(WRP)保护的文件或注册表项,或者由 Windows 文件保护(WFP)保护的文件,则必须将此资源用作组件的 KeyPath。 在这种情况下,Windows Installer 不会安装、更新或删除组件。 不应在安装包中包含任何受保护的资源。 应改为使用 windows 资源保护 支持的资源替换机制。 有关详细信息,请参阅 使用 Windows Installer 和 Windows 资源保护

言论

有关组件和功能之间的关系的讨论,请参阅 功能表

安装程序跟踪独立于注册表中的共享 DLL 引用计数的共享 DLL。 如果注册表中存在共享 DLL 的引用计数,则安装程序在安装文件时始终递增计数,并在卸载时递减该计数。 如果未设置 msidbComponentAttributesSharedDllRefCount,并且引用计数尚不存在,安装程序将不会创建一个。 请注意,对于安装到 System 文件夹的任何文件,注册表中的 SharedDL 引用计数会递增。

如果未设置 msidbComponentAttributesSharedDllRefCount,则即使仍需要,其他应用程序也可以删除组件。 若要查看这种情况如何发生,请考虑以下方案:

  • 使用安装程序的应用程序安装共享组件。
  • 未设置 msidbComponentAttributesSharedDllRefCount 位,并且没有引用计数。 因此,安装程序不会开始引用计数。
  • 共享此组件且不使用安装程序的旧应用程序已安装。
  • 旧版应用程序为共享组件创建并递增引用计数。
  • 卸载旧版应用程序。
  • 共享组件的引用计数将递减为零,并删除该组件。
  • 使用安装程序的应用程序不再有权访问组件。

若要避免此行为,请设置 msidbComponentAttributesSharedDllRefCount

请注意,不应将系统服务组件指定为从源运行,而无需专门为此类使用而设计。 有关更多详细信息,请参阅 ServiceInstall 表

请注意,对于包含要进入系统文件夹的动态链接库的组件,不应设置启用从源运行的属性。 原因是,如果组件安装状态通过遵循某个功能或在 UI 中设置,将组件安装状态设置为从源运行,则对 DLL 上的 LoadLibrary 的后续调用将失败。

另请参阅 控制功能选择状态

验证

ICE02
ICE03
ICE06
ICE07
ICE08
ICE09
ICE18
ICE19
ICE21
ICE30
ICE32
ICE35
ICE38
ICE41
ICE42
ICE43
ICE46
ICE50
ICE54
ICE57
ICE59
ICE62
ICE67
ICE76
ICE79
ICE80
ICE83
ICE86
ICE88
ICE91
ICE92
ICE97