2011-04-20 56 views
0

我有一個應用程序將由另一個程序安裝(基本上是一個包裝,安裝多個應用程序和報告每個通過/失敗)。包裝開發團隊的要求是,在安裝完成後,我的應用程序必須將成功寫入特定註冊表項。Wix安裝程序(3.0) - 安裝成功或失敗後如何寫入註冊表?

對於我的解決方案,我想我可以用來初始化註冊表項以成功的製作安裝開始時,並更新價值失敗只有在安裝失敗(或者反過來)。

基於閱讀的例子,通過維克斯幫助瀏覽和搜索類似的問題,我敢肯定我需要使用自定義操作,像

<Custom Action="SetInstallationStatusFail" After="InstallFinalize">NOT Installed</Custom> 

我停留在這個地方現在是我不知道我需要爲SetInstallationStatusFail寫什麼代碼才能更新註冊表項。我也不確定什麼父元素將其放在下面。我認爲它應該是簡單的這樣

<RegistryValue Action="write" Root="HKLM" Key="SOFTWARE\$(var.RegistryCompanyName)\$(var.RegistryProductName)\InstallStatus" Name="install" Type="string" Value="Fail" /> 

如果你覺得我想要做的東西是無效的,或者如果你知道wrting到註冊表中的一個更好的解決方案的安裝後,請讓我知道。謝謝。

回答

0

另一個選擇是測試註冊表中的值是否存在。

您的安裝程序將值寫入註冊表,值可以是成功。如果該值存在於註冊表中,則安裝成功;如果沒有,則安裝失敗。

+0

我問開發團隊如果安裝後註冊表項不存在,會發生什麼情況......他們的應用程序假定我的安裝失敗。所以,從短期來看,我會在安裝過程中寫下成功的,而在失敗的時候,不會有任何關鍵。從長遠來看,我想我會試着讓他們接受標準的返回碼。謝謝大家。 – nairb 2011-04-21 17:09:38

3

這是一個不好的要求,因爲註冊表值將被「孤立」而無需清理它。 MSI已經提供了一種確定成功或失敗的方法:返回代碼。有關列表,請參閱MSI SDK中的「錯誤代碼」。

MSI沒有提供在失敗後向本地或通過自定義操作寫入HKLM註冊表的方法。 (有些行爲可能因錯誤而被觸發,但他們沒有權限寫入HKLM。)

+0

感謝鮑勃。我同意這個要求是不好的,我試圖讓團隊接受標準的返回代碼來工作,但我不確定他們現在是否願意改變。除了HKLM之外,寫什麼呢?這可能嗎? – nairb 2011-04-20 19:33:47

1

與包裝人員聊天,看他們是否願意考慮其他選項 - 即使他們可以「 t接受返回代碼並想要檢查其他地方還有其他方法使用Windows Installer API執行此操作。

例如,下面是一個非常簡單的VBScript,用於循環查看當前安裝的產品,以查看應用程序是否按名稱安裝。

productName = "My Application" 

Set installer = Wscript.CreateObject("WindowsInstaller.Installer") 

For Each productCode In installer.Products 
    If LCase(installer.ProductInfo(productCode, "ProductName")) = LCase(productName) Then Exit For 
Next 

If IsEmpty(productCode) Then 
    Wscript.Echo "Couldn't find " & productName 
Else 
    Wscript.Echo "Found " & productName 
End If 
0

這是一個想法。在成功案例或失敗案例中,您都可以在這兩種情況下編寫註冊表值。編寫自定義操作以寫入成功值。編寫並計劃回滾自定義操作以寫入失敗的值。如果安裝失敗,它將回滾並且回滾自定義操作將寫入失敗。如果成功,則在未安裝條件的情況下在自定義操作中寫入值成功。

在這兩種情況下這些註冊表值可以在卸載過程中刪除。這可能不是一個優雅的解決方案,但如果這是您的要求,那麼您可以實現它。

也許Bob Arnson可以對此解決方案發表評論。

相關問題