Component 表

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

类型 密钥 Nullable
组件 Identifier Y N
ComponentId GUID N Y
Directory_ Identifier N N
特性 整数 N N
条件 条件 N Y
KeyPath Identifier N Y

Component

标识组件记录。

主表键。

ComponentId

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

请注意,这些 GUID 的字母必须为大写。 GUIDGEN 等实用程序可生成包含小写字母的 GUID。 必须将小写字母更改为大写,才能使这些组件代码 GUID 生效。

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

Directory_

Directory 表中条目的外部键。 这是一个属性名称,其值包含实际路径,可通过 AppSearch 操作或使用从 Directory 表获取的默认设置进行设置。

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

Directory 表第一列的外部键。

Attributes

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

注意

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

位标志
msidbComponentAttributesLocalOnly
0
0x0000
组件不能从源运行。 为属于某个功能的所有组件设置此位,以防止该功能从网络运行或从源运行。 请注意,如果某个功能没有组件,则该功能始终将“从源运行”和“从我的电脑运行”显示为有效选项。
msidbComponentAttributesSourceOnly
1
0x0001
组件只能从源运行。 为属于某个功能的所有组件设置此位,以防止该功能从我的电脑运行。 请注意,如果某个功能没有组件,则该功能始终将“从源运行”和“从我的电脑运行”显示为有效选项。
msidbComponentAttributesOptional
2
0x0002
组件可以在本地运行,也可以从源运行。
msidbComponentAttributesRegistryKeyPath
4
0x0004
如果设置了此位,KeyPath 列中的值将用作 Registry 表中的键。 如果 Registry 表中相应记录的“值”字段为 null,则该记录中的“名称”字段不得包含“+”、“-”或“*”。 有关详细信息,请参阅 Registry 表中“名称”字段的说明。
对于写入 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
如果设置了此位,且组件的键路径文件或键路径注册表项已存在,则安装程序不会安装或重新安装组件。 应用程序将自身注册为组件的客户端。
将此标志仅用于由 Registry 表注册的组件。 不要将此标志用于由 AppIdClassExtensionProgIdMIMEVerb 表注册的组件。
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 值的组件。 如果组件未标有此位,则安装取代修补程序可能会在计算机上留下未使用的组件。
设置 MSIUNINSTALLSUPERSEDEDCOMPONENTS 属性的效果与为所有组件设置此位的效果相同。
Windows Installer 4.0 及更早版本:msidbComponentAttributesUninstallOnSupersedence 值不受支持,并且将被忽略。

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

Condition

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

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

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

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

KeyPath

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

如果值不为 null,则 KeyPath 是 RegistryODBCDataSourceFile 表中的主键,具体取决于属性值。 如果 KeyPath 为 null,则将 Directory_ 列的文件夹用作键路径。

由于安装程序创建的文件夹在变为空时会被删除,因此必须在 CreateFolder 表中创作一个条目才能安装由空文件夹组成的组件。

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

备注

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

安装程序独立于注册表中的共享 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