【发布时间】:2022-01-22 20:18:54
【问题描述】:
我有一个软件包,其先前安装的版本包含一系列设计不佳的自定义操作:它们执行的操作可以开箱即用。因此,我将删除这些以供将来的版本使用。
这些自定义操作的条件会导致一系列错误 - 它们都在升级期间的卸载步骤中第二次运行。为了规避不良行为,我想提供一个自定义操作,如果检测到某个应用程序,它会修改以前安装的应用程序的数据库。
给定应用程序名称、版本和自定义操作名称,如何在升级时的自定义操作期间为卸载步骤禁用它?
当我在升级安装期间在 C++ 自定义操作中运行我的代码时,我尝试修改自定义操作条件失败:MsiOpenDatabaseW throws access violation when executed within an msi custom action
基本上我使用MsiOpenDatabaseW 来修改缓存的msi 数据库。它在独立可执行文件中运行时有效,但在自定义操作中会导致访问冲突。
【问题讨论】:
-
造成麻烦的具体情况是什么?
-
@SteinÅsmul 条件本身与问题无关,当使用
MsiOpenDatabaseW和查询命令运行独立 exe 时,我可以使用 MSI 数据库查询成功修复它。问题是MsiOpenDatabaseW在运行安装过程中无法运行stackoverflow.com/questions/70660365/… -
如果您使用自己的属性 - 换句话说,它不是 MSI 本身的内置属性 - 也许您可以使用自定义操作修改其值以确保条件为假,因此有问题的自定义操作不运行?这只有在特殊情况下才有可能,而且当您采取变通办法时,总是有可能出现新错误。
-
@SteinÅsmul 正如我所说,我可以在卸载步骤中成功修改 cached 安装程序的自定义操作条件以生成
false。问题是在重大升级安装期间在自定义操作中运行MsiOpenDatabaseW时收到段错误。我已经链接了相关问题。 -
有关由于对话框或自定义操作意外运行而导致的卸载问题的链接显示了如何轻松使用次要升级补丁在调用之前修复已安装产品的卸载顺序 - 问题是 the delivery method for the patch。
标签: c++ windows-installer