微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 WiX 中有条件地设置属性或 RegistryValue?

如何解决如何在 WiX 中有条件地设置属性或 RegistryValue?

我有一个包含如下组件的 Wix 工具集项目,其中 MYLANGUAGE 是可以在安装产品时设置的公共属性

      <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 键中设置该值。该值应设置如下:

  • 如果在安装时设置了公共属性 MYLANGUAGE,则该属性的值应存储在 HKLM\Software\MyCompany\MyProduct 语言中
  • 如果公共属性 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 位临时属性。 如果 MYLANGUAGE 为空(也许他们在命令行传递它)并且 64 位临时属性不为空,则使用 SetProperty 自定义操作将 64 位临时属性分配给 MYLANGUAGE

如果 MYLANGUAGE 为空(也许他们在命令行传递它)并且 32 位临时属性不为空,则使用 SetProperty 自定义操作将 32 位临时属性分配给 MYLANGUAGE

如果 MYLANGUAGE 为空,则使用 SetProperty 自定义操作将 MyLanguageDefault 分配给 MYLANAGUGE(在命令行中没有传递任何内容,并且在 32 位或 64 位中没有找到任何内容,然后使用默认值)

如果您希望他们能够编辑它,请在对话框中显示 MYLANGUAGE。

在 Component/RegistryValue 中使用 MYLANAGUAGE 将值写入 64 位注册表。该组件需要将 Win64 属性设置为 yes。

请注意,MYLANGUAGE 还需要使用 Secure="yes" 属性标记为安全自定义公共属性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。