出于某种原因,我们正在交付一个带有我们自己的安装 GUI 的产品,这意味着我们将在后台静默运行 msi 安装。
通过使用 MSI API“MsiInstallProduct”,我可以静默安装产品,但我不知道如何获取此安装的进度数据以及如何取消它。
有人有一些想法吗?
出于某种原因,我们正在交付一个带有我们自己的安装 GUI 的产品,这意味着我们将在后台静默运行 msi 安装。
通过使用 MSI API“MsiInstallProduct”,我可以静默安装产品,但我不知道如何获取此安装的进度数据以及如何取消它。
有人有一些想法吗?
2018 年 6 月更新:虽然下面显示的工具不再可供下载,但我通过 Wayback 机器找到了它。我认为链接到它是可以且合法的,因为该工具是免费软件。更新了下面的链接。
更新:遗憾的是,Wise 的这个工具不再可下载。我也不确定是否可以分发它。它似乎是作为主要 Wise Package Studio 套件的一部分分发的免费工具,但我不认为它是开源的。我希望他们将其作为开源工具发布。
由于一些法律问题,Wise 包装产品已停产。
我相信您可以通过 MSI API 获得进度,但如果我是您,我只会在通过msiexec.exe调用安装后显示 MSI 本身的进度条。
MSI 支持几种不同的安装级别(完全、完全静默、基本 GUI、简化 GUI 等...)。在您的情况下,听起来您想要一个基本的 UI。这会产生一个进度条,您可以在其中隐藏取消按钮,并可选择显示完成模式对话框:
使用进度条静默安装,没有取消按钮,最后没有模式对话框:
msiexec.exe /I "Test.msi" /QB-!
为避免不得不手动构建这些愚蠢的 msiexec 命令行,请使用Wise的msi 命令行构建器工具: http ://www2.wise.com/filelib/WICLB.exe (从 Wayback 机器复活)。
为安全起见,请通过virustotal.com下载。
相关:
这是一个示例项目,似乎可以执行您所指的操作:http: //www.codeproject.com/KB/cs/msiinterop.aspx
您需要在 MsiInstallProduct 之前使用 MsiSetExternalUI 或 MsiSetExternalUIRecord 指定外部 UI 处理程序(后者更好,但具有更高的 MSI 版本要求)。对于 Windows 安装程序希望您处理的每条消息,都将调用您指定的函数。这将为您提供数据,并有机会响应告诉它取消。如果您需要 MSI 4.5 或更高版本,您可以使用不需要引导程序的嵌入式外部 UI 处理程序 DLL。