如何从Setup.exe引导程序调用MSI时确定返回代码

时间:2015-01-29 16:53:23

标签: .net visual-studio-2010 batch-file windows-installer setup-project

我们有一个从VS 2010构建的Win Forms应用程序,并且有一个VS安装项目,它创建一个MSI和一个Setup.exe作为引导程序。

MSI包含在一个自解压缩的7zip文件中,该文件在提取时调用批处理文件,而过去的批处理文件将直接使用/passive开关执行MSI,它会给出不同的消息取决于返回代码,如下所示......

IF %ErrorLevel% EQU 1602 GOTO :INSTALL_CANCELLED
IF %ErrorLevel% NEQ 0 GOTO :INSTALL_FAILED

直接执行MSI意味着跳过引导过程,如果需要,则不会安装先决条件。所以我想更改它,以便我们在包中包含Setup.exe引导程序,并执行Setup.exe /passive而不是直接调用MSI。

这样可以正常工作,除非出现问题,在这种情况下%ErrorLevel%仍然返回0.我假设这是因为Setup.exe调用MSI,而不管MSI是否出现错误或不,Setup.exe以退回代码0退出。

如果我正在调用Setup.exe而不是直接调用MSI,有没有办法检测MSI是否返回非零代码?

*编辑

我发现了这篇MSDN文章,其中说明了以下内容......

  

请注意,Setup.exe Bootstrapper示例不需要检查   主机应用程序myapp生成的错误代码,因为这是   不是静默安装,所有错误都会显示给用户   Windows Installer用户界面。

https://msdn.microsoft.com/en-us/library/xhz1cfs8(v=vs.90).aspx#cpconsetupexebootstrappersampleoperationsanchor4

WTF他们的意思是“因为这不是静音安装”?他不是。它们支持传递/ passive开关使其成为静默安装,但是它们无法从MSI中获取返回代码,用“因为这不是静默安装”。

现在我只是在讨论一个弃用的Visual Studio功能,所以我猜它就是它。

2 个答案:

答案 0 :(得分:2)

setup.exe必须显示退出代码。

FWIW,Windows Installer XML(WiX)有一个引导程序(Burn),您可以自定义(实现引导程序应用程序层)并执行任何您想要执行的操作。

答案 1 :(得分:1)

编辑:我误解了这个问题;我以为你在运行别人的安装项目。但是,由于这个答案对某些人来说可能仍然有用,而且我已经写好了,我还是会发布它。

不容易,而不是批次。

如果启动设置过程within a job object,您可以将其分配给完成端口并侦听JOB_OBJECT_MSG_NEW_PROCESS消息。然后,您必须打开新进程,检查它是否为msiexec.exe并保留进程句柄。

设置过程完成后,使用msiexec.exe的存储过程句柄通过GetExitCodeProcess()检索退出代码。