我正在维护一个旧应用程序,其中用户配置存储在注册表中。卸载时留下。我现在正在WiX中重写安装程序。
如果没有,安装程序应在注册表中添加默认值,否则 应该保留现有的价值。
我在考虑如何在WiX中执行此操作。我提出的解决方案有点麻烦:
<Property Id="MY_PROPERTY">
<RegistrySearch Root="HKLM" Key="SOFTWARE\MyProduct" Name="MyProperty" Type="raw" />
</Property>
<CustomAction Id="ca.SetDefaultValue" Property="MY_PROPERTY" Value="DefaultValue" />
<InstallExecuteSequence>
<Custom After="RegistrySearch" Action="ca.SetDefaultValue">Not MY_PROPERTY</Custom>
</InstallExecuteSequence>
<Component Id="c.Registry">
<RegistryValue Root="HKLM" Key="SOFTWARE\MyProduct" Name="MyProperty" Type="string" Value="[MY_PROPERTY]" />
</Component>
所以进行注册表搜索以查找旧值。如果未设置,请使用计划的自定义操作设置为默认值。然后像往常一样创建值。
任何人都能想出更顺畅的方法吗?
请注意,我不能使用方便的变量,例如Installed
,因为值可能在那里,由之前的,现在已卸载的版本留下。
答案 0 :(得分:8)
从Wix Remember Property pattern开始,但再往前走一步。运行AppSearch
并且REMEMBERME
属性获取或未获取值后,请使用SetProperty
自定义操作分配REMEMBERME=""
的默认值。
我更进了一步。我有一个概念,我称之为“财产优先权”。基本上,它是一个关于财产如何获得它的价值的优先级列表。
从最高到最低:
AppSearch
Property
表换句话说,在第一次没有在命令行传递属性的静默安装期间,应该使用属性表中的默认值。
在第二次静默安装期间,命令行没有传递任何属性,记住的值应优先于默认值。 (如果不同)
在第一次静默安装期间,在命令行传递的属性应被视为覆盖值,并优先于默认值和记住的值。
在交互式安装期间,将执行上述规则,UI应显示该值。如果用户更改了值,则这是最终值。
我将向您介绍如何实现各种自定义操作来执行此操作。它通常涉及临时道具和真正的道具以及一系列具有正确执行计划和条件的集合属性CA,以执行您希望它执行的操作。
答案 1 :(得分:1)
您尚未在组件中的注册表值上明确设置keypath=yes
。但是,在这种情况下,wix将选择可用作键路径的第一个子项。来自wix component element documentation:
如果组件或子注册表值或文件的KeyPath未设置为“是”,则WiX将按顺序查看组件下的子元素,并尝试自动选择其中一个作为键路径。
因此,您的注册表值是安装它的组件的keypath。这意味着如果注册表值已存在,则不会安装该组件。据我所知,这就是你想要的行为。