2014-03-26 103 views
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> 

安装

回答

0

简短的回答是创建你的代码的注册表项,并与您的代码修改,那么很明显,你是如何管理这些项目,而不是你和MSI安装程序。

另一种方法是将它们放在一个组件中,它自身带有一个空组件guid,然后MSI在它安装完成后根本无法管理它。

+0

我放置了空组件guid,但卸载后注册表项'StatusBar'的值仍为'1'。在自定义操作中,我试图在卸载时将其更改为'0',但它不会修改。 – 123r789

+0

是的,我发现我犯了什么错误。在我的自定义操作中,我将整型而不是REG_DWORD放在类型中。 – 123r789

0

Phil已经回答了,但也许我可以补充说,您可以使用(REMOVE =“ALL”AND NOT UPGRADINGPRODUCTCODE)来执行卸载过程中要执行的自定义操作。然后,只需将注册表组​​件永久设置(HKCU注册表数据也不应该真正卸载 - 尽管存在一些争议)。但这仍然不能修复卸载时未登录的用户的HKCU数据。这是一个非常复杂的任务,可能与ActiveSetup有关。

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

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

查看this thread底部检测不同安装模式的条件列表。