2012-04-19 83 views
7

我在我的项目中的以下CustomAction:如何从CustomAction获取返回码?

<CustomAction Id="InstallDriver" 
        Return="check" 
        Execute="deferred" 
        Impersonate="no" 
        FileKey="FileDriverInst" 
        ExeCommand="-install" /> 

<InstallExecuteSequence> 
    <Custom Action="InstallDriver" Before="InstallServices" /> 
</InstallExecuteSequence> 

用于安装,如果安装失败,因为系统需要重新启动下一个以前的驱动程序卸载驱动程序产生有用的返回代码,例如程序。

当前,如果返回成功以外的任何内容,则会出现一个对话框,提示“程序作为设置的一部分运行未按预期完成”。并且安装失败。这不是最佳的。

如何获取并处理返回码?

+0

你的整个设计不是最优的。它对Windows安装程序没有任何作用,也不是声明性的。有更好的安装驱动程序的模式。 – 2012-04-19 15:17:07

+1

@ChristopherPainter这个包的基于Wix的安装程序必须使用与我们其他安装机制相同的工具,恐怕我没有发言权。 – fredley 2012-04-19 15:21:27

+1

然后,我无能为力。这就是MSI处理EXE呼叫的方式。您必须编写自己的自定义操作来包装EXE调用,然后解释失败原因。对我而言,这只是增加了另一个失败点。 – 2012-04-19 15:44:44

回答

3

Windows Installer不支持处理自定义操作返回值。

对于EXE自定义操作,将非零返回值解释为错误,并停止安装。只有win32 DLL或VBScript自定义操作可以通过其return code更改安装行为,但它仍然非常有限。

如果要在安装后重新启动机器,可以设置REBOOT属性。

3

添加为“答案”的要求:

你的整个设计不是最优的。它对Windows安装程序没有任何作用,也不是声明性的。有更好的安装驱动程序的模式。

这就是MSI处理EXE呼叫的方式。您必须编写自己的自定义操作来包装EXE调用,然后解释失败原因。对我而言,这只是增加了另一个失败点。

1

您无法从CustomAction中获取返回码,但可以围绕您设置返回码属性的方式进行回合。这可能与获取返回码相同。

您必须在脚本/ dll中执行您的自定义操作。否则,返回码只出现在日志中。

例如,如果您有属性像

<Property="MyCode" Secure="yes"> 

然后在VBScript(或JScript)即可获得该财产的这样的值:

的VBScript

Session.Property("MyCode") 

最初它是空的。你可以将它设置在VBScript这样的:

If someCondition = 4 Then 
    Session.Property("MyCode") = "4" // For a return code of 4 
End If 

一旦回到你的维克斯.wxs文件,如果你看看你的财产的价值,现在是4。你甚至可以用它在CDATA标签。

例如,只产卵一个对话框,如果mycode的等于4

<Publish Dialog="SpawnDialog" ...><![CDATA[ MyCode = 4 ]]></Publish> 
相关问题