2010-06-24 41 views
1

我有一個在InstallShield 2010中從頭開始編寫的InstallScript項目。它包含三個本機InstallShield對象和四個包裝MSM文件的InstallShield合併模塊持有者對象。InstallScript項目在升級時給出錯誤1706

當我最初測試該項目時,它在乾淨的環境下安裝得很好,但是當我嘗試升級到較新的版本時,四個合併模塊持有者對象中的每一個產生了「錯誤1706」。產品XXXX「消息。

我在網上做了一些挖掘,發現這是一個Windows安裝程序錯誤,並且它發生的原因是MSI文件必須存在於計算機上,即使原始安裝介質消失後也是如此。推薦的方法是勾選「合併模塊持有者對象」屬性對話框中的「在本地緩存msi包」複選框。

我勾選了所有四個合併模塊的框並重新測試,但沒有解決問題。然後我查看了這些合併模塊實際上放在硬盤上的位置。屬性對話框<DISK1TARGET>,在運行時解析爲C:\Program Files\InstallShield Installation Information\{產品GUID}。看着測試機器,好像所有四個合併模塊都寫入了相同的地方,從而覆蓋了彼此的MSI文件。

爲了解決這個問題,我編輯了每個合併模塊以將自己緩存到唯一路徑,<DISK1TARGET>\{Name}。我再次編譯和測試,我可以看到每個合併模塊現在確實將自己保存到唯一的子文件夾中。但是,所有四個錯誤1706消息是仍然我升級時出現。

有沒有人有任何想法?我確信我錯過了一些明顯的東西,但它似乎沒有被記錄在任何地方。 :-)

UPDATE:

根據地段上的InstallShield論壇的帖子,看來的InstallShield生成每次構建的InstallScript項目時,每個嵌入MSI一個全新的產品GUID。在更新過程中,InstallShield引擎會用新版本覆蓋緩存在目標機器上的每個MSI文件,但是當執行它們時,Windows Installer會說:「嘿,這是一款新產品,舊產品的MSI在哪裏,以便我可以卸載它嗎?「,因此錯誤。

是否可以告訴InstallShield不要爲每個構建中的每個嵌入式MSI重新生成產品GUID?當然,這種行爲會對嵌入合併模塊到InstallScript項目的整個想法產生嘲弄嗎? :-(

回答

0

我用得到這個工作:

  1. 獲得對應的MSM,我們已經有幸運的,這是有可能爲所有這些獨立MSI設置
  2. 包括MSI的作爲安裝組件。在安裝InstallScript項目,安裝到目標的適當臨時位置。
  3. 在相關<feature>_Installed事件,掏出來msiexec.exe和運行與/i/qb開關MSI文件。
  4. 在相關的<feature>_UnInstalling事件中,輸出到msiexec.exe並使用/x開關運行MSI文件。

這感覺有點「錯誤」,但它工作得很好,所以我很樂意把它留在那裏,除非任何人有任何更好的想法。