如何在卸载时修改注册表项值而不从wix中的注册表中删除密钥?

时间:2014-03-26 11:56:26

标签: wix custom-action registrykey

我在安装时在注册表中添加了一个注册表项值。我想在卸载时修改该注册表项值,但我不想从注册表中删除它。

1)我尝试在卸载时执行自定义操作以修改注册表值。但是注册表值在卸载时从注册表中删除。

2)如果我使组件具有透明性,那么它就不会在卸载时修改键值。

  <Component Id="SampleRegComp"
       Guid="3865FE52-F8EE-4E29-B321-BDF0FD6D3F58"
             Permanent="yes">
    <RegistryKey Action="create"
      Key="SOFTWARE\Microsoft\Notepad"
      Root="HKCU">
      <RegistryValue Name="StatusBar" Type="integer" Value="1" />
    </RegistryKey>

  </Component>

<CustomAction
Id="ModifyOutlookRegInitSign_12"
Return="ignore"
Directory="TARGETDIR"
ExeCommand= "&quot;[SystemFolder]reg.exe&quot; ADD &quot;HKCU\SOFTWARE\Microsoft\Notepad&quot; /v StatusBar /t integer /d 0 /f" >
</CustomAction>

      安装

2 个答案:

答案 0 :(得分:0)

简短的回答是使用您的代码创建注册表项并使用您的代码进行修改,然后很明显您正在管理这些条目,而不是您和MSI设置。

另一种方法是使用null组件guid将它们单独放入组件中,然后MSI在安装后根本不会对它进行管理。

答案 1 :(得分:0)

菲尔已经回答了,但也许我可以补充一点,您可以使用( REMOVE =“ALL”而不是UPGRADINGPRODUCTCODE )来执行卸载期间要执行的自定义操作。然后只需将注册表组​​件设置为永久性(HKCU注册表数据也不应该被真正卸载 - 尽管有些争论)。这仍然无法修复卸载时未登录的用户的HKCU数据。这是一个涉及更多的任务,可能与ActiveSetup有关。

添加NOT UPGRADINGPRODUCTCODE可确保在主要升级过程中执行的卸载不会更新注册表,因为产品随后将重新安装。对您的案例不一定是必要的,但确保自定义操作不会不必要地运行。

我建议在InstallExecuteSequence中安装InstallFinalize之前安排自定义操作。我没有测试过这个位置,但它是卸载过程中运行的最后一个操作之一,应该具有所需的效果。

请参阅this thread底部检测不同安装模式的条件列表。