如何在使用MSI数据库升级安装过程中禁用以前安装的版本的特定CustomAction



我有一个包,它以前安装的版本包含一系列设计糟糕的自定义操作:它们做的事情可以开箱即用。因此,我将在未来的版本中删除这些
这些自定义操作的条件会导致一系列错误——它们都是在升级过程中的卸载步骤中第二次运行的。为了避免不希望的行为,我想提供一个自定义操作,如果检测到以前安装的应用程序的数据库,它会修改该数据库。

给定一个应用程序名称、版本和自定义操作名称,如何在升级时的自定义操作过程中禁用它作为卸载步骤


在升级安装期间,当我在C++自定义操作中运行代码时,我试图修正自定义操作条件失败:MsiOpenDatabaseW在msi自定义操作中执行时引发访问冲突
基本上我使用MsiOpenDatabaseW来修改缓存的msi数据库。它在独立可执行文件中运行时有效,但在自定义操作中会导致访问冲突。

您需要为缓存(已安装(MSI的自定义操作修改InstallExecuteSequence/InstallUISequence的"Condition"。这里可以找到一个示例,它基于ProductCode搜索缓存的MSI,并修改InstallExecuteSequence:中的自定义操作的条件

https://www.alkanesolutions.co.uk/2012/12/08/editing-msi-files-in-the-windows-installer-cache/

编辑:一些同事编写了一份关于安装测试的免费指南。也许避免这种代价高昂的错误在未来会有用。

我建议一个更简单的解决方案是手动修复计算机上的条件并重建MSI。

然后获取此MSI并将其包含在应用程序的下一版本中,然后在RemoveExistingProduct标准操作之前运行自定义操作以重新缓存它。

msiexec /fv <path of the fixed msi>

这样,在触发升级之前,具有错误条件的安装程序会被重新缓存,并且您不需要编写代码来直接修改缓存的MSI

最新更新