2013-04-15 77 views
0

我們遇到InstallShield .MSI從舊版軟件升級時未創建註冊表值的問題。傳統軟件創建了一個鍵值爲HKLM\\Software\Company\Appname的數值。在現代軟件中,我們希望將新值Path添加到同一個關鍵字(但保留舊值)。看起來,如果密鑰本身已經存在,安裝程序就不會努力創建新的值。在InstallShield中公開的唯一選項包含「如果不存在則創建密鑰」以及用於卸載行爲的不同選項。似乎沒有辦法說「即使密鑰已經存在,也要創建這個值」。在現有密鑰下安裝新的註冊表值

有沒有人知道創建註冊表值條目的方法,即使密鑰已經存在?我不介意InstallScript解決方案,除非我想要卸載來移除它。

+0

只需設置值。如果它還不存在,這將創造價值。 –

+0

@HansPassant這不是,但。它會在安裝時根本不存在密鑰來創建它,但如果密鑰存在,則不會創建註冊表值。 – drharris

回答

0

經過深入研究,實際上發生了一件有趣的事情。從MSI日誌記錄中,我們確定它在安裝過程中正在執行WriteRegistryValues動作,然後在接近尾聲時執行RemoveRegistryValues。事實證明,這是因爲RemoveExistingProducts行動即將結束,就在安裝完成之前。相反,我將該操作移至InstallValidateInstallInitialize之間的頂部附近。這是先執行傳統卸載,然後再安裝正確的註冊表設置。我猜測傳統卸載程序要求刪除整個密鑰。

對於遇到此問題的其他人,此解決方案有一些缺點。這意味着聲明爲舊產品代碼的任何內容都將被刪除,這可能會導致覆蓋某些設置並重新寫入文件。但是,對我們來說,這個缺點要比沒有處於正確狀態的註冊表替代方案更好。

對於在查看日誌之前打開問題表示歉意,但我希望其他人可以從此解決方案中受益。

0

您需要爲新的註冊表值創建分離的組件,然後所有應該都可以。 可能您嘗試將註冊表項(在InstallShield中)添加到當前註冊表組件,但是當安裝程序更新它時,會發現此組件已安裝並且不會執行任何操作。

相關問題