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

| 我有一个将由另一个程序安装的应用程序(基本上是一个包装程序,可安装多个应用程序并报告每个应用程序的通过/失败)。包装开发团队的要求是,安装完成后,我的应用程序必须将成功或失败写入特定的注册表项。 对于我的解决方案,我想我可以在安装开始时将注册表项初始化为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\" />
如果您认为我正在尝试做一些无效的事情,或者您知道安装后写到注册表的更好解决方案,请告诉我。谢谢。     
已邀请:
另一个选择是测试注册表中的值是否存在。 您的安装程序将一个值写入注册表,该值可以是Success。如果注册表中存在该值,则说明安装成功;如果不是,则安装失败。     
这是一个不好的要求,因为注册表值将是“孤立的”,没有任何清理对象。 MSI已经提供了一种确定成功或失败的方法:返回码。有关列表,请参见MSI SDK中的\“错误代码\”。 MSI无法提供本地或自定义操作失败后写入HKLM注册表的方法。 (有些操作可以在发生错误时触发,但是它们没有写HKLM的特权。)     
与包装人员聊天,看看他们是否愿意考虑其他选择-即使他们不接受返回码并想检查其他地方,还有其他使用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
    
这是一个想法。在成功案例或失败案例中,您都可以写入注册表值。编写自定义操作以写入成功值。编写并计划回滚自定义操作以写入失败的值。如果安装失败,它将回滚,并且回滚自定义操作将写入失败。如果成功,则在未安装条件的情况下,在自定义操作中写入成功值。 无论哪种情况,都可以在卸载期间删除这些注册表值。这可能不是一个很好的解决方案,但是如果您有此要求,则可以实现。 也许鲍勃·阿森(Bob Arnson)可以对此解决方案发表评论。     

要回复问题请先登录注册