【问题标题】:Innosetup deletes abc.msi when it's still neededInnosetup 在仍然需要时删除 abc.msi
【发布时间】: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


【解决方案1】:

使用这个 sintax -> {{guid} double { 是一个转义字符,所以它告诉 inno setup 这是字面值而不是像 {sys} 那样的常量。对不起我的英语。

您应该使用产品代码而不是 msi 文件。为什么?产品代码始终可用并且是唯一的。该文件可以删除或更改,您的卸载将失败。

我创建了一个我称之为通用卸载程序的解决方案。它在注册表 HKLM 或 HKLM32 的显示名称字符串值中搜索特定字符串,当它找到它时,它会读取卸载字符串。如果它包含 msiexec,它会忽略它并使用与产品引用相同的键名,后缀为 /qn。如果它不是一个 msi,它使用卸载字符串。如果我知道卸载程序,我会在调用该函数时添加必要的参数以保持静音。为什么我这样做?我使用 inno setup 作为安装和配置其他安装程序的引导程序。当我收到新版本时,我不必更改 inno 设置脚本并再次编译。我只是覆盖旧的安装程序,使用相同的名称。

希望对您有所帮助。

【讨论】:

  • 我是否需要双 { 也当我关闭字符串或仅当我打开时? (谢谢,不用担心英语,我也不太擅长。)
猜你喜欢
  • 2018-03-14
  • 2011-02-07
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2021-01-28
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多