0

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

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>

已安装

4

2 回答 2

0

Phil 已经回答了,但也许我可以补充一点,您可以使用(REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE)在卸载期间执行自定义操作。然后只需将注册表组​​件设置为永久(HKCU 注册表数据也不应该真正被卸载 - 虽然这是一个有争议的问题)。不过,这仍然无法修复卸载时未登录的用户的 HKCU 数据。这是一个更复杂的任务,可能使用 ActiveSetup 来完成。

添加 NOT UPGRADINGPRODUCTCODE 可确保作为主要升级的一部分执行的卸载不会更新注册表,因为随后将重新安装该产品。对于您的情况,这不是必需的,但可以确保自定义操作不会不必要地运行。

我建议在 InstallExecuteSequence 中的 InstallFinalize 之前安排自定义操作。我还没有测试过这个位置,但它是卸载期间最后运行的操作之一,应该会产生预期的效果。

请参阅此线程底部的检测不同安装模式的条件列表。

于 2014-03-26T18:14:37.277 回答
0

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

另一种方法是将它们单独放入一个带有空组件 guid 的组件中,然后 MSI 在安装后根本不会管理它。

于 2014-03-26T17:34:51.447 回答