我在安装时在注册表中添加了一个注册表项值。我想在卸载时修改该注册表项值,但我不想从注册表中删除它。
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= ""[SystemFolder]reg.exe" ADD "HKCU\SOFTWARE\Microsoft\Notepad" /v StatusBar /t integer /d 0 /f" >
</CustomAction>
安装
答案 0 :(得分:0)
简短的回答是使用您的代码创建注册表项并使用您的代码进行修改,然后很明显您正在管理这些条目,而不是您和MSI设置。
另一种方法是使用null组件guid将它们单独放入组件中,然后MSI在安装后根本不会对它进行管理。
答案 1 :(得分:0)
菲尔已经回答了,但也许我可以补充一点,您可以使用( REMOVE =“ALL”而不是UPGRADINGPRODUCTCODE )来执行卸载期间要执行的自定义操作。然后只需将注册表组件设置为永久性(HKCU注册表数据也不应该被真正卸载 - 尽管有些争论)。这仍然无法修复卸载时未登录的用户的HKCU数据。这是一个涉及更多的任务,可能与ActiveSetup有关。
添加NOT UPGRADINGPRODUCTCODE可确保在主要升级过程中执行的卸载不会更新注册表,因为产品随后将重新安装。对您的案例不一定是必要的,但确保自定义操作不会不必要地运行。
我建议在InstallExecuteSequence中安装InstallFinalize之前安排自定义操作。我没有测试过这个位置,但它是卸载过程中运行的最后一个操作之一,应该具有所需的效果。
请参阅this thread底部检测不同安装模式的条件列表。