【发布时间】:2017-12-11 11:28:46
【问题描述】:
我正在尝试在 wix 安装程序中执行我的自定义操作,以删除之前在 InstallExecuteSequence 中写入的注册表项,然后再安装软件,如下所示:
<InstallExecuteSequence>
<Custom Action="RemoveExistingReristryKey" Sequence="150">NOT Installed</Custom>
</InstallExecuteSequence>
运行 .msi 文件时,调用了函数 RemoveExistingReristryKey 并删除了注册表项,我可以看到日志:
... 行动于 17:12:59 结束:CostFinalize。返回值 1。
MSI (c) (90:54) [17:12:59:596]:执行操作:RemoveExistingReristryKey 行动 17:12:59:RemoveExistingReristryKey。 动作开始时间 17:12:59:RemoveExistingReristryKey。 MSI (c) (90:E4) [17:12:59:616]:调用远程自定义操作。 DLL:C:\Users\CUONG~1.HUY\AppData\Local\Temp\MSIF947.tmp,入口点:_RemoveExistingReristryKey@4 MSI (c) (90:8C) [17:12:59:616]:启用隐形。 MSI (c) (90:8C) [17:12:59:616]:在调用 Install on Server 之前尝试启用所有禁用的权限 MSI (c) (90:8C) [17:12:59:616]:连接到 CA 接口的服务。 RemoveExistingReristryKey:已删除先前安装的注册表项。 操作于 17:12:59 结束:RemoveExistingReristryKey。返回值 1。
MSI (c) (90:54) [17:12:59:668]:执行操作:MaintenanceWelcomeDlg ...
但是,我想修复的错误仍然发生,但是,如果我手动删除此注册表项,错误就会消失。
我认为我的自定义操作执行得太晚了,所以我尝试通过自定义操作的一些选项进行编辑,例如:在 InstallExecuteSequence 中的之前、之后、序列以立即执行此自定义操作并在所有其他操作之前执行,但它仍然不是,它总是在标准操作“CostFinalize”之后执行。
如何在运行 .msi 文件以删除注册表项时立即执行我的自定义操作?
非常感谢!
【问题讨论】:
-
我有点困惑。听起来您正在尝试删除在安装过程中也写入注册表的密钥。大概您只需要部分安装的注册表项,并且在安装完成之前需要它吗?
-
@CalumMacLeod 我有一个错误如下:安装我的软件时,如果我们在特殊情况下取消此过程(出现提取对话框时取消),我们无法重新安装此软件,因为之前在 SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products 中创建了一个注册表项...如果我手动删除此注册表项,我可以正常重新安装我的软件,所以我想在安装之前在 wix 中进行自定义操作以删除此注册表,但是,我的自定义操作似乎执行得太晚了,所以我无法重新安装我的软件。
-
因此,我想在 wix 的所有其他操作之前立即执行我的自定义操作。
标签: windows wix registry installation