Installation Inno安装程序:覆盖现有安装或显示目录提示

Installation Inno安装程序:覆盖现有安装或显示目录提示,installation,inno-setup,Installation,Inno Setup,如果我的设置中有以下内容,那就太好了: 如果以前没有安装,则应显示目标目录的编辑字段 如果有以前的安装,则应询问用户是否要覆盖现有安装(无目录) 提示应该是可见的)或者如果他想在 不同的目录作为单独的安装(卸载列表中有两个条目)。如果选择此选项,则编辑字段 对于目标目录,应显示 是否可以使用现有的Inno设置选项来实现这一点?还是必须构建自定义对话框页?在开头(),检查应用程序是否已安装(请参阅下面代码中的GetUninstallString)。如果是,请询问用户该做什么(请参阅代码中的用法

如果我的设置中有以下内容,那就太好了:

  • 如果以前没有安装,则应显示目标目录的编辑字段
  • 如果有以前的安装,则应询问用户是否要覆盖现有安装(无目录) 提示应该是可见的)或者如果他想在 不同的目录作为单独的安装(卸载列表中有两个条目)。如果选择此选项,则编辑字段 对于目标目录,应显示
是否可以使用现有的Inno设置选项来实现这一点?还是必须构建自定义对话框页?

在开头(),检查应用程序是否已安装(请参阅下面代码中的
GetUninstallString
)。如果是,请询问用户该做什么(请参阅代码中的用法和第一个屏幕截图)。如果用户选择更新现有安装,请正常进行。默认情况下,Inno安装程序不允许更改现有安装的安装路径(请参阅)

如果uses选择安装另一个副本,请设置为新的唯一值(
GetAppId
代码中的函数)。这将使Inno安装程序将安装视为新的,因此它将提示输入安装路径。同时更新,以便用户在选择要卸载的副本时可以区分安装(请参见
GetAppIdentification
和第三个屏幕截图)。同时更新到新的唯一路径(请参见
GetAppIdentification
和第三个屏幕截图)

[代码]
变量
实例:字符串;
函数GetAppId(参数:string):string;
开始
结果:='{#AppName}'+实例;
终止
函数GetAppIdentification(参数:string):string;
开始
如果实例为“”,则结果为:='('+实例+');
终止
函数GetUninstallString():string;
变量
卸载键:字符串;
开始
卸载密钥:=
'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+GetAppId('')+''u is1';
RegQueryStringValue(HKA,UninstallKey,'UninstallString',结果);
日志(结果)
终止
函数InitializeSetup():Boolean;
变量
消息:字符串;
答:整数;
开始
结果:=真;
如果GetUninstallString()='',则
开始
日志(“应用程序未安装,安装第一个副本”);
终止
其他的
开始
日志('应用程序已安装,询问要做什么');
信息:=
'此程序已安装,'+
'是否要更新现有安装?'+
'按否安装程序的另一个副本';
回答:=MsgBox(消息,mbConfirmation,MB_YESNOCANCEL);
如果答案=田园诗,那么
开始
日志(“用户选择更新安装”);
终止
其他的
如果答案=IDNO,则
开始
日志('用户选择安装另一个副本');
实例:='2';
终止
其他的
开始
日志(“用户选择中止安装”);
结果:=假;
终止
终止
终止


现在的问题是,如果已经有两个安装,该怎么办。要生成第三个(或更多个),只需循环,增加
实例
中的值,直到
GetUninstallString
返回空字符串。但是如果您希望用户能够选择要更新的副本,那么这将更加困难。这对一个问题来说太多了



你想做的事情很复杂。如果您想保持灵活性,我认为最简单的解决方案是将每个新版本视为一个单独的软件。此外,在开始安装时,出于对那些只想保留最新版本的用户的礼貌,请提供自动卸载以前(最新)的安装。如果用户已经安装了多个应用程序,请不要做任何特定的操作(或只是通知用户)。

我将责任推给用户(安装应用程序的用户)来解决这个问题通过在安装程序的命令行上指定
/instancename
参数(
AppId
指令使用脚本常量),明确指定他们要安装应用程序的单独实例。

确定。你想做的事情很复杂。如果您想保持灵活性,我认为最简单的解决方案是将每个新版本视为一个单独的软件。此外,在开始安装时,出于对那些只想保留最新版本的用户的礼貌,请提供自动卸载以前(最新)的安装。如果用户已经有多个安装,不要做任何特定的事情(或者只是通知用户)。好的,现在我认为这是最好的解决方案。非常感谢你!我正在使用这段代码,我将尝试修改它,使其提供最新安装版本。我想我必须使用“InstallDate”注册表项。
#define AppName "My Program"
#define AppVersion "1.5"

[Setup]
AppId={code:GetAppId}
AppName={#AppName}
AppVersion={#AppVersion}
UninstallDisplayName={#AppName} {#AppVersion}{code:GetAppIdentification}
UsePreviousLanguage=no # Needed when AppId is dynamic
DefaultDirName={autopf}\My Program{code:GetAppIdentification}