2014-03-26 101 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底部檢測不同安裝模式的條件列表。