组件表
组件表列出组件,并具有以下列。
列 | 类型 | 钥匙 | 空 |
---|---|---|---|
元件 | 标识符 | 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
- 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
仅将此标志用于注册表表注册的组件。 请勿将此标志用于由 AppId、类、扩展、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
设置 MSIUNINSTALLSUPERSEDCOMPONENTS 属性与为所有组件设置此位的效果相同。
Windows Installer 4.0 及更早版本: 不支持 msidbComponentAttributesUninstallOnSupersedence 值,并且将被忽略。- msidbComponentAttributesShared
- 2048
- 0x0800
如果 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 的后续调用将失败。
另请参阅 控制功能选择状态。