【发布时间】:2014-06-19 05:38:19
【问题描述】:
在我的 Inno Setup 安装过程中,将一个文件 abc.msi 复制到安装目录中,然后正确安装。 但是在卸载过程中 abc.msi 不会被卸载。 在对卸载日志进行调查后,我明白了原因。以下是日志的一部分,为了更清楚,我用数字替换了日期/小时:
0. [deleting all the files... INCLUDING abc.msi!]
1. Uninstallation process succeeded.
2. Removed all? Yes
3. Need to restart Windows? No
4. INFO: Execute command: msiexec.exe /x "C:\Program Files (x86)\InstallationDir\abc\abc.msi" /QUIET /NORESTART
5. ERROR: Command failed. Error code: 1619
错误是因为第4步的命令调用太晚(删除abc.msi后,见第0步)所以我们在第5步有错误。
现在,卸载命令如下:
procedure CurUninstallStepChanged(...)
[code...]
begin
if (CurUninstallStep = usUninstall) then
begin
[code...]
ExecCommand('msiexec.exe', ' /x "' + pathTo_abc.msi + '" /QUIET /NORESTART');
[code...]
end
end
所以我的问题是在删除 abc.msi 而不是 CurUninstallStepChanged 之前在哪里调用要执行的命令,或者使用什么正确的 installStep 代替 usUninstall。我也试过 usPostUninstall,没有任何区别。
【问题讨论】:
-
这听起来很奇怪。看看
code that runs。首先使用usUninstall步骤触发CurUninstallStepChanged事件方法,然后在您的日志示例中处理卸载并记录步骤2。简而言之,CurUninstallStepChanged事件和usUninstall步骤在卸载(删除)任何内容之前被触发。它应该这样工作。 -
你的意思是我做对了吗?
-
是的。
usUninstall步骤块中的内容应在卸载任何内容之前执行。我想到一件事,您是在同步运行该命令吗,您是在等待它完成吗? -
我认为它不是同步的(它不是我写的,我只是在其中更改一些内容)。无论如何,我只是注意到我可以将命令放在函数 InitializeUninstallProgressForm() 中,在删除文件之前肯定会调用它。
-
感谢 TLama 和 RobeN 的回答。现在我正在按照另一种方式在卸载过程中完全不使用 abc.msi。卸载可以使用注册表值来完成:
msiexec.exe /x {12345678-9ABC-DEF0-1234-56789ABCDEF0} /NORESTART但我还是要测试一下,我会告诉你的。
标签: inno-setup