我正在编写一个Inno Setup安装程序,可以多次安装并安装第三方产品。每次安装都需要第三方产品,因此在卸载我的应用程序时,我会在[UninstallRun]
条目上运行检查功能,以查看我的应用程序是否还有更多实例仍在系统上。如果是这样,我不会删除第三方产品(只卸载我的应用程序的最后一个实例将卸载这些......)。
问题是,似乎[UninstallRun]
检查功能在安装期间执行和评估而不是卸载(因为卸载数据是在安装期间构建的)。这意味着如果我卸载我的应用程序的第一个安装的实例,而不是删除第三方产品(因为安装第一个产品的时间没有我的应用程序的其他实例)。
有没有办法告诉Inno安装程序执行[UninstallRun]
部分的检查功能,只在卸载时?
如果没有任何想法如何实现所需的行为?
答案 0 :(得分:3)
没有。
但是,您可以编写一些将在卸载时执行的[Code]
。通常情况如下:
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then begin
if ShouldUninstallComponentX() then begin
UninstallComponentX();
end;
end;
end;
当然,您需要自己填写ComponentX函数,并且您需要根据需要添加错误检查等。
但是,在自动卸载第三方产品时仍需要注意。除非您的应用程序有关于它们的安装方式的独特之处(例如,在数据库服务器的情况下是自定义实例名称),否则当某个其他应用程序仍在使用该产品时,您可能仍会无意中卸载该产品,或者它可能当你还需要它时卸载它。
如果它的大小足以成为“产品”,那么它应该在程序和功能中有自己的条目 - 如果是这种情况,那么最好留给用户决定何时删除它,或者通过永远不会自动删除它,或者通过询问用户您认为卸载是否安全(即,当您的应用程序的最后一个副本被删除时),无论他们是否真的想要。
较小的共享库组件通常采用不同的方法;您可以直接在[Files]
中添加库,而不是运行完整的安装/卸载程序,并使用sharedfile
标志来跟踪何时可以安全删除它们。 (当然,这依赖于所有应用程序做同样的事情 - 但这对于不使用Inno作为其安装程序的应用程序也有效。)
理想情况下,如果该产品旨在用作共享组件,则应该有关于如何正确确定何时没有其他应用程序需要它的文档。