2

我正在编写一个 Inno Setup 安装程序,它可以安装多次,也可以安装第三方产品。每次安装都需要第三方产品,因此在卸载我的应用程序时,我会在[UninstallRun]条目上运行检查功能,以查看系统上是否还有我的应用程序实例。如果是这样,那么我不会删除第三方产品(只有卸载我的应用程序的最后一个实例才能卸载这些......)。

问题在于,似乎[UninstallRun]检查功能在安装期间执行和评估,而不是在卸载期间(因为卸载数据是在安装期间构建的)。这意味着如果我卸载我的应用程序的第一个安装实例,它会删除第三方产品(因为第一个安装的时间没有我的应用程序的其他实例)。

有没有办法告诉 Inno Setup[UninstallRun]在卸载期间并且仅在卸载时执行该部分的检查功能?如果没有任何想法如何实现所需的行为?

4

1 回答 1

3

那没有。

但是,您可以编写一些[Code]将在卸载时执行的内容。通常是这样的:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then begin
    if ShouldUninstallComponentX() then begin
      UninstallComponentX();
    end;
  end;
end;

当然,您需要自己填写 ComponentX 函数,并且您需要根据需要添加错误检查等。

不过,在自动卸载第三方产品时,您仍然需要小心。除非您的应用程序的安装方式有其独特之处(例如,数据库服务器的自定义实例名称),否则您可能仍会在其他应用程序仍在使用该产品时无意中卸载该产品,或者它可能当你仍然需要它时卸载它。

如果它大到足以成为“产品”,那么它应该在程序和功能中拥有自己的条目——如果是这种情况,那么最好让用户决定何时删除它,或者通过永远不要自己自动删除它,或者在您认为可以安全卸载时询问用户(即,当您的应用程序的最后一个副本被删除时)他们是否真的想要卸载。

较小的共享库组件通常采用不同的方法;而不是运行完整的安装/卸载程序,您可以直接将库包含在其中[Files]并使用sharedfile标志来跟踪它们何时可以安全删除。(当然,这依赖于所有应用程序做同样的事情——但这甚至适用于不使用 Inno 作为其安装程序的应用程序。)

理想情况下,如果产品打算用作共享组件,它应该有关于如何正确确定何时没有其他应用程序需要它的文档。

于 2013-10-25T08:38:21.417 回答