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
对于写入 HKCU 配置单元的注册表项,建议设置此位。 这可确保当同一台计算机上有多个用户时,安装程序会写入必要的 HKCU 注册表项。- msidbComponentAttributesSharedDllRefCount
- 8
- 0x0008
- msidbComponentAttributesPermanent
- 16
- 0x0010
- msidbComponentAttributesODBCDataSource
- 32
- 0x0020
- msidbComponentAttributesTransitive
- 64
- 0x0040
仅应为可传递组件设置此位。 请参阅使用可传递组件。- msidbComponentAttributesNeverOverwrite
- 128
- 0x0080
将此标志仅用于由 Registry 表注册的组件。 不要将此标志用于由 AppId、Class、Extension、ProgId、MIME 和 Verb 表注册的组件。- msidbComponentAttributes64bit
- 256
- 0x0100
如果这是替换 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
设置 MSIUNINSTALLSUPERSEDEDCOMPONENTS 属性的效果与为所有组件设置此位的效果相同。
Windows Installer 4.0 及更早版本:msidbComponentAttributesUninstallOnSupersedence 值不受支持,并且将被忽略。- msidbComponentAttributesShared
- 2048
- 0x0800
如果 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 是 Registry、ODBCDataSource 或 File 表中的主键,具体取决于属性值。 如果 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 的后续调用将失败。
另请参阅控制功能选择状态。