Wix安装程序(3.0) - 如何在安装成功或失败后写入注册表?

时间:2011-04-20 18:57:08

标签: wix wix3

我有一个应用程序将由另一个程序安装(基本上是一个包装器,它安装多个应用程序并报告每个应用程序的通过/失败)。包装器开发团队的要求是我的应用程序必须在安装完成后将 Success Fail 写入特定的注册表项。

对于我的解决方案,我认为我可以在安装开始时初始化 Success 的注册表项,并且仅在安装失败时将值更新为 Fail (或另一种方式)。

基于阅读示例,浏览Wix帮助以及搜索类似问题,我非常确定我需要使用自定义操作,例如

<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" />

如果您认为我正在尝试做一些无效的事情,或者如果您知道在安装后向注册表提供更好的解决方案,请告诉我们。谢谢。

4 个答案:

答案 0 :(得分:3)

这是一个不好的要求,因为注册表值将是“孤立的”,没有任何东西可以清理它。 MSI已经提供了一种确定成功或失败的方法:返回代码。有关列表,请参阅MSI SDK中的“错误代码”。

MSI没有提供在失败后写入HKLM注册表的方法,无论是本机还是通过自定义操作。 (有些操作可以在出错时触发,但是他们没有权限写入HKLM。)

答案 1 :(得分:1)

与包装器人聊天,看看他们是否愿意考虑其他选项 - 即使他们不能接受返回代码并想要在其他地方检查,还有其他方法可以使用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

答案 2 :(得分:0)

另一种选择是测试注册表中的值是否存在。

您的安装程序将值写入注册表,值可以是 Success 。如果注册表中存在该值,则安装成功;如果没有,则安装失败。

答案 3 :(得分:0)

这是一个想法。在成功案例或失败案例中,您可以在两种情况下编写注册表值。编写自定义操作以写入成功值。编写并安排回滚自定义操作以写入失败的值。如果安装失败,它将回滚并且回滚自定义操作将写入失败。如果成功,则在未安装条件的自定义操作中写入值成功。

在任何一种情况下,都可以在卸载期间删除这些注册表值。这可能不是一个优雅的解决方案,但如果这是您的要求,那么您可以实现它。

也许Bob Arnson可以评论这个解决方案。