c++ - 如何从 msi 安装中检索详细结果

标签 c++ wix windows-installer

我有一个由 Wix 工具集创建的 .msi 文件,用于安装 5 个驱动程序。我有一个安装应用程序,用于通过 CreateProcess 使用 msiexec.exe 命令启动 .msi,并提供一个 UI。目前,我的需求是获取安装的详细结果——哪些驱动安装成功,哪些驱动安装失败。由于我只能得到 CreateProcess 的结果,我如何从安装中检索详细的结果?如果您能提供有关此问题的一些信息,我们将不胜感激。

我创建了带有 difx:Driver 标志的 .msi 文件,如下所示:

<difx:Driver AddRemovePrograms="no" DeleteFiles="no" ForceInstall="no" Legacy="no" PlugAndPlayPrompt="no" />

最佳答案

基于 MSI 的设置是事务性的。它要么全部工作,要么全部失败,并将系统回滚到以前的状态。看来您已经选择打败这种范式,并让它部分成功,保留一些驱动程序,而另一些则不安装。

您似乎还抑制了安装程序的 UI,因此无法找到错误信息。

我有两个建议:

  1. 不要使用 CreateProcess() 和“即发即弃”模型。将 MsiSetExternalUIRecord 用于此模型:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb309215(v=vs.85).aspx

那里也有 C# p/invoke 等价物。如果您不想显示所有 UI,那么只需收集错误消息并向用户显示(如果这是目标)。这是获取实际错误消息的唯一可靠方法。这是支持您拥有 UI 并仅收集您认为重要的消息的方式。

  1. 允许失败的驱动程序安装使整个安装失败并全部回滚。实际上可能已经是这样了。如果部分安装成功,但没有安装四个驱动程序,计划是什么?您不能再次运行 MSI,因为它将进入修复/维护模式。如果用户需要修复某些东西并重新安装,则无论如何都需要卸载该产品。

关于c++ - 如何从 msi 安装中检索详细结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38364091/

相关文章:

c# - WixSharp 注入(inject)多个自定义 CLR 对话框

c++ - 错误 : pointer being freed was not allocated

installation - Wix - 跟踪已安装的应用程序

wix - 包括所有依赖项

windows - 无法安装 Meteor : Error 0x80070643: Failed to install MSI package

wix - 使用 WiX 创建桌面快捷方式

c++ - 在通过构造函数传递变量的对象中创建对象

c++ - MFC的CListCtrl排序(SortItems)是稳定排序吗?

c++ - 在 C/C++ 中签名扩展数字的最佳方法是什么

c# - 如何在自定义操作中获取路径文件安装程序