组件表

组件表列出组件,并包含以下列。

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

组件

标识组件记录。

主表键。

ComponentId

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

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

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

Directory_

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

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

目录表一列的外部键。

属性

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

注意

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

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


msidbComponentAttributesUninstallOnSupersedence
1024
0x0400
为修补程序包中的组件设置此位以防止将孤立组件保留在计算机上。 如果安装了后续修补程序,请使用 msidbPatchSequenceSupersedeEarlier 值在其 MsiPatchSequence 表中标记以取代第一个修补程序,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

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

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

KeyPath

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

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

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

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