2009-08-31 79 views
1

我在Visual Studio中有一個安裝項目。作爲常規安裝的一部分,它會在Windows註冊表中創建/更新某些鍵和值。我怎樣才能使更新可逆?VS安裝項目;如何在卸載時恢復註冊表值?

你可能會說「他們是可逆的」,但我不這麼認爲。以下是我認爲它的工作原理:使用VS設計器來指定您想要的註冊表項和值。這些鍵和值在安裝過程中寫入,在卸載過程中被刪除。簡單。什麼是不可逆的?

當安裝過程中寫入的某個鍵中存在某個值時,會出現問題。假設它的值爲1.然後在新安裝時,它的值爲100.卸載後,它根本沒有任何價值 - 價值已經消失。


我試着用「自定義操作」來解決這個問題。

安裝期間,如果用戶確認,msiexec將值寫入註冊表。無論在註冊表鍵之前,都不見了。 (我們稱之爲「更新A」)

要保留該值,在安裝時,會有一個自定義操作讀取並保留「before」設置。它在「更新A」之前運行。到現在爲止還挺好。

在卸載時,正常的操作過程是刪除安裝期間添加的常規註冊表項和值。這工作得很好。稱這個「更新B」。

要還原原始註冊表值,我有另一個「自定義操作」。這個在卸載時運行。它成功地將原始值恢復到註冊表中。註冊表看起來就像在最初的安裝之前一樣。我驗證了這可以使用ProcMon(一種讓我監視註冊表更新等的工具)。調用這個「更新C」。

只有一個問題。在卸載時,更新B正在發生更新C.這意味着,在自定義操作恢復原始註冊表設置後,msi會清除還原的值,就像它處理所有其他註冊表更新一樣。

結果是註冊表具有空值而不是恢復的值。

任何幫助?我如何重新排列更新?我需要Orca嗎?我真的不想安裝和學習另一種工具來實現這一點。我也希望它是自動的。絕對不想通過一個MSI編輯器直觀地點擊來實現這一點。


我可以通過使用WindowsInstaller.Installer類的Javascript後期構建事件來做到這一點嗎? Aaron Stebner published a script添加了「安裝後啓動應用程序?」對話框到由Visual Studio生成的MSI。 Windows Installer支持「啓動應用程序」功能,但未在VS2008/2005的設計人員中公開。在啓動對話框中添加一個快速生成器腳本,作爲VS中的後期構建步驟運行。

與自定義操作的排序可能類似嗎?

回答

1

我一些答案:

  • 是的,這可能與JavaScript實現一個postbuild一步做到這一點。
  • 是的,我會使用WindowsInstaller.Installer類。
  • 是,逆戟鯨必要弄清楚這一切

奧卡清楚地表明,旨在恢復註冊表值運行自定義操作之前,內置的動作,消除註冊表值。

orca http://i31.tinypic.com/33vc02b.jpg

所以我必須寫一個腳本來改變1698年至2620年,和註冊表值應該得到適當的恢復。


編輯:沒那麼快。 這個想法是對的,但它不像改變序列號那麼簡單。問題是,「保存的」註冊表值位於註冊表樹中,被卸載程序刪除。因此,這兩個訂單都無效。如果A是恢復,B是刪除,則A-B將僅恢復註冊表,以便稍後刪除恢復的值。 B-A將首先刪除該值,然後A將無法恢復。原因是A(恢復部分)將要恢復的值存儲在要刪除的樹中。

因此,正確的操作必須是類似於A -B-A, where A的東西,它將存儲的要恢復的值存儲在一個不會被B刪除的位置。然後B刪除特定於應用程序的鍵並值在註冊表中。 A恢復被A`剪掉的設置。

爲了做到這一切,我必須在MSI文件上做一些手術,因爲Visual Studio中的香草MSI設計器不允許設置特定的序列號。你需要使用Orca,這是一個GUI工具,或者,在我的情況下,我使用COM接口到WindowsInstaller,通過javascript自動執行更改。

相關問題