要了解如何使用软件:
在启动安装程序时,用户可以选择是安装还是更新软件,如果他使用安装选项安装软件,那么也可以通过卸载程序定期卸载软件。
我现在也把安装功能错当成了更新功能,这里我们来区分一下Inno Setup的正常升级功能和我通过代码创建的更新选项,更新选项不过是正常的安装,但是用户必须事先指定预装软件的路径,这与我们大多数用户以前已经手动安装了软件有关。(Java、Tomcat和我们的Web应用程序)。正常安装和我专门创建的更新选项到目前为止工作正常。
通过在安装或更新过程中设置的注册表项,我可以使用“安装程序”或“更新程序”选项区分软件是否已安装或更新。
如果用户现在已经通过正常安装选项安装了软件,那么应该可以完全卸载它。(Inno Setup)卸载程序应该删除所有文件。但是,如果用户使用更新选项,则不应该是这种情况。更新功能的工作原理是在常规安装之前备份一些文件,使用DelTree删除不必要的文件,然后让安装重新创建它们。
是否可以设置一个条件,以便在用户以前使用过“更新”选项的情况下,卸载程序不会删除“文件”部分中的这些文件?
当然,通常情况下,如果用户以前使用安装选项安装了软件,卸载程序应该删除这些文件。但是,如果用户以前在安装程序中选择了更新选项,我不希望删除这些文件。
以下是我的选择的简要部分:
[Setup]
UninstallFilesDir={code:UnInstallerPath}
[Files]
Source: "<source>\Tomcat9\*"; DestDir: "{code:GetTomcatSourcepath}"; Excludes: "webapps"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "<source>\{#JAVA}\*"; DestDir: "{code:GetJAVAExtractpath}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "<source>\Tomcat9\webapps\ROOT\*"; DestDir: "{code:GetWebAppSourcepath}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "<source>\config\*"; DestDir: "{code:GetConfigInstallPath}"; Check: IsInstaller; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "<source>\libraries\{#DLLFile}"; DestDir: "{code:GetConfigInstallPath}"; Flags: ignoreversion
[UninstallDelete]
Type: filesandordirs; Name: "{code:GetUninstallPath}"; Check: IsInstalledviaProgram;
Type: filesandordirs; Name: "{code:UnInstallerPath}";
因此,如果安装程序仅用于使用我创建的更新功能进行更新,则卸载程序不应删除除其自身的exe和相关数据文件以外的任何文件。
由于我希望能够卸载应用程序,如果它是以前安装的安装选项,我很遗憾不能使用“uninsneveruninstall”标志。
为了更好地理解,您可以在下图中看到启动安装程序后显示的第一个页面。
1条答案
按热度按时间ih99xse11#
所有
Check
functions(包括UninstallDelete
section中的Check
functions)都在 * 安装 * 时进行评估。而不是在 * 卸载 * 时进行评估。根据您的
IsInstalledviaProgram
函数的名称,我猜它是以在卸载程序中工作的方式实现的(通过检查注册表项?)。但是它实际上是在安装过程中执行的。所以你应该检查单选按钮,而不是注册表项(它们在调用函数时的状态可能还不对应)。也许IsInstaller
是你应该使用的函数。