我在WiX 3.5天后創建了一個基於WiX的安裝程序。那時的文檔比現在更糟糕。更糟糕的是,這是我第一次安裝—,所以我沒有做正確的事情。WiX:使用新版本安裝程序「修復」原始版本卸載問題的合理方法
一些背景:安裝程序安裝了兩個應用程序和一個驅動程序(每個驅動程序都是由一個或多個組件組成的獨立功能部件)。有問題的應用之一是用VB6編寫的供應商專有設備配置應用程序。由於它是一個VB6應用程序,因此它使用庫comctl32.ocx
和tabctl32.ocx
。
問題的癥結在於我沒有看到Windows Vista(和/或Windows XP上的%windir%\System32
文件夾中的這兩個庫?我不記得,自從我第一次寫這個安裝程序已經有幾年了)。所以我想我需要安裝這兩個庫以及所有必需的COM註冊表項。 (我最終將COM庫安裝在我的應用程序文件夾—中,就像您爲私有程序集一樣,但是在HKLM中全局註冊它們。)我創建第一個安裝程序時讀到的東西,我從來沒有發現過,從Windows XP開始,COM組件可以並排安裝。 (即便如此,爲什麼我沒有使用MSI表格Clsid,ProgId等—,這些表格今天被認爲是不被接受的,但它至少會比我所做的更正確?但是我離題了;完成了什麼在MSI的土地完成)無論如何,創建原始安裝程序的時候,我用下面的WiX的標記創建的COM註冊表值:
<RegistryValue ... Action="write" />
我還要提到的是在那個時候,我還沒有遇到任何來就像我這次有種'組件規則101'那樣的文檔。所以,這個MSI不遵循組件規則。 MSI爲每個COM庫及其關聯的註冊表值包含一個組件,COM庫爲其組件的KeyPath
。
問題是,如果在原始MSI運行並安裝我的產品的第一個版本之前存在註冊表項/值,卸載會導致這些鍵/值從系統中刪除?(我假設這些鍵/值是在Windows安裝過程中創建的—,所以他們已經引用了計數?)我不想在依賴這些庫的用戶系統上打破其他應用程序。
如果回答上述是肯定的,那麼我目前的計劃,以糾正這種情況是:
- 作者新的MSI爲
<MajorUpgrade />
—畢竟,我是執行升級。 - 提供comctl32.ocx和tabctl32.ocx COM庫原始安裝程序中的COM註冊表項—我在猜測我需要用CA(或多個CA)來做到這一點,在下次升級時再次移除。我看到的完成這兩種方法之一:
- 直接創建照顧,以確保該值的註冊表項匹配全新的Windows安裝(適當OS的版本上安裝程序正在執行)
- 動態將要創建的註冊表項添加到MSI註冊表中(如果我理解正確,則不會在卸載方面跟蹤Windows安裝程序?)
如果MSI覆蓋先前存在的註冊表項上卸載刪除,那麼:
- 是我提出的解決方案可以接受嗎?
- 用於替換已刪除註冊表項的兩個選項中哪一個最好?
- 如果這兩個選項都不可接受,那麼是否有人會對我如何糾正這種情況有任何其他建議,以免打破可能依賴於相關庫的其他應用程序?
我越想到這個問題,就越覺得我無法修復它。我將COM庫安裝在我的應用程序文件夾中,但手動將它們全局註冊(即在HKLM中)。不好!我不知道是否有任何其他用戶應用程序可能依賴這些庫,如果有的話,那些相應的安裝程序可能已安裝它們。所以,當我的產品卸載時,我不知道要在哪裏指出,RegSvr32,重新註冊他們的系統。奇怪的是,這ICE從來沒有出現在原來的發展:(。 – fourpastmidnight
順便說一句,我知道一個很長的「問題」,但最初的安裝者已經在野外多年了。 :(現在只是我試圖「升級」安裝以包含一個64位驅動程序,在這個過程中,我發現我的原始安裝程序存在嚴重錯誤 – fourpastmidnight
有時候作爲補丁發貨的小升級有助於修復現有的安裝程序在刪除它之前。 –