9

我的项目中有以下 CustomAction:

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

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

安装驱动程序的程序会产生有用的返回代码,例如,如果安装失败,因为在先前的驱动程序卸载后需要重新启动系统。

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

如何获取和处理返回码?

4

3 回答 3

5

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

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

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

于 2012-04-20T04:28:37.527 回答
3

应要求添加为“答案”:

你的整个设计不是最优的。它超出了 Windows Installer 的进程,并且不是声明性的。安装驱动程序有更好的模式。

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

于 2014-04-18T22:08:05.897 回答
2

您无法从 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

回到您的 WiX .wxs 文件后,如果您查看属性的值,它现在是 4。您甚至可以在 CDATA 标记中使用它。

例如,仅当 MyCode 等于 4 时才生成对话框。

<Publish Dialog="SpawnDialog" ...><![CDATA[ MyCode = 4 ]]></Publish>
于 2015-11-19T19:55:10.503 回答