如何在 WiX 中有条件地设置 属性 或 RegistryValue?
How do you conditionally set a property or RegistryValue in WiX?
我有一个 Wix 工具集项目,其中包含如下组件,其中 MYLANGUAGE 是 public 属性,可以在安装产品时设置:
<Component Id='language_reg' Guid='*' Permanent='yes'>
<Condition>MYLANGUAGE</Condition>
<RegistryValue Type='string' Root='HKLM' Key='Software\MyCompany\MyProduct' Name='language'
Value='[MYLANGUAGE]' KeyPath='yes' />
</Component>
现在我正在把这个软件包从32位升级到64位。由于 WOW64,我的软件现有 32 位版本的上述密钥存储在 HKLM\Software\WOW6432Node\MyCompany\MyProduct 下。
升级到新的 64 位版本的软件包后,我也想在 HKLM\Software\MyCompany\MyProduct 键中设置值。该值应设置如下:
- 如果在安装时设置了 public 属性 MYLANGUAGE,那么 属性 的值将以 HKLM\Software\MyCompany\MyProduct 语言
存储
- 如果 public 属性 MYLANGUAGE 未设置 和 HKLM\Software\MyCompany\MyProduct 键不存在且 HKLM\Software\WOW6432Node\MyCompany\MyProduct 语言值已设置,然后我希望将值从 HKLM\Software\WOW6432Node\MyCompany\MyProduct 语言复制到 HKLM\Software\MyCompany\MyProduct 语言
如何使用 WIX 工具集执行此操作?
这是 WiX 记住的 属性 模式,但有点复杂。
使用 MYLANGAUGE 的默认值定义 属性 MyLanguageDefault
使用 AppSearch/Reglocator (Property/RegistrySearch) 将 64 位值读入 64 位临时值 属性。
使用 AppSearch/Reglocator (Property/RegistrySearch) 将 32 位值读入 32 位临时值 属性。
使用 Set属性 自定义操作将 64 位温度 属性 分配给 MYLANGUAGE 如果 MYLANGUAGE 为空(可能他们在命令行传递了它)并且 64 位温度 属性 不为空
如果 MYLANGUAGE 为空(也许他们在命令行传递了它)并且 32 位温度 属性 不为空,则使用 Set属性 自定义操作将 32 位温度 属性 分配给 MYLANGUAGE
如果 MYLANGUAGE 为空(命令行中未传递任何内容且在 32 位或 64 位中未找到任何内容,则使用默认值),使用 Set属性 自定义操作将 MyLanguageDefault 分配给 MYLANAGUGE )
如果您希望他们能够编辑它,请在对话框中显示 MYLANGUAGE。
在 Component/RegistryValue 中使用 MYLANAGUAGE 将值写入 64 位注册表。该组件需要将 Win64 属性设置为 yes。
请注意,还需要使用 Secure="yes" 属性将 MYLANGUAGE 标记为安全自定义 Public 属性。
我有一个 Wix 工具集项目,其中包含如下组件,其中 MYLANGUAGE 是 public 属性,可以在安装产品时设置:
<Component Id='language_reg' Guid='*' Permanent='yes'>
<Condition>MYLANGUAGE</Condition>
<RegistryValue Type='string' Root='HKLM' Key='Software\MyCompany\MyProduct' Name='language'
Value='[MYLANGUAGE]' KeyPath='yes' />
</Component>
现在我正在把这个软件包从32位升级到64位。由于 WOW64,我的软件现有 32 位版本的上述密钥存储在 HKLM\Software\WOW6432Node\MyCompany\MyProduct 下。
升级到新的 64 位版本的软件包后,我也想在 HKLM\Software\MyCompany\MyProduct 键中设置值。该值应设置如下:
- 如果在安装时设置了 public 属性 MYLANGUAGE,那么 属性 的值将以 HKLM\Software\MyCompany\MyProduct 语言 存储
- 如果 public 属性 MYLANGUAGE 未设置 和 HKLM\Software\MyCompany\MyProduct 键不存在且 HKLM\Software\WOW6432Node\MyCompany\MyProduct 语言值已设置,然后我希望将值从 HKLM\Software\WOW6432Node\MyCompany\MyProduct 语言复制到 HKLM\Software\MyCompany\MyProduct 语言
如何使用 WIX 工具集执行此操作?
这是 WiX 记住的 属性 模式,但有点复杂。
使用 MYLANGAUGE 的默认值定义 属性 MyLanguageDefault
使用 AppSearch/Reglocator (Property/RegistrySearch) 将 64 位值读入 64 位临时值 属性。
使用 AppSearch/Reglocator (Property/RegistrySearch) 将 32 位值读入 32 位临时值 属性。 使用 Set属性 自定义操作将 64 位温度 属性 分配给 MYLANGUAGE 如果 MYLANGUAGE 为空(可能他们在命令行传递了它)并且 64 位温度 属性 不为空
如果 MYLANGUAGE 为空(也许他们在命令行传递了它)并且 32 位温度 属性 不为空,则使用 Set属性 自定义操作将 32 位温度 属性 分配给 MYLANGUAGE
如果 MYLANGUAGE 为空(命令行中未传递任何内容且在 32 位或 64 位中未找到任何内容,则使用默认值),使用 Set属性 自定义操作将 MyLanguageDefault 分配给 MYLANAGUGE )
如果您希望他们能够编辑它,请在对话框中显示 MYLANGUAGE。
在 Component/RegistryValue 中使用 MYLANAGUAGE 将值写入 64 位注册表。该组件需要将 Win64 属性设置为 yes。
请注意,还需要使用 Secure="yes" 属性将 MYLANGUAGE 标记为安全自定义 Public 属性。