如何使用Inno检测和安装先决条件?

时间:2019-07-25 19:12:18

标签: inno-setup

我需要为使用Inno的应用安装一些先决条件。我希望先决条件仅在先决条件不存在或为较早版本时安装。我发现了一些解决方案,例如:

[Code]
procedure InstallFramework;
var
  ResultCode: Integer;
begin
  if not Exec(ExpandConstant('{tmp}\NDP472-KB4054530-x86-x64-AllOS-ENU.exe'), '/q /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
  begin
    { you can interact with the user that the installation failed }
    MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.',
      mbError, MB_OK);
  end;
end;

看起来好像没有检查框架是否已经存在或可能已经安装了哪个版本。

用于查找先前安装的版本的模式是什么,如果存在,则检查版本,如果该版本较旧或不存在,则进行安装?

1 个答案:

答案 0 :(得分:1)

这是一个简单的答案,可以带您进入许多可能的解决方案之一。

在测试环境(或您的计算机)中,安装应用程序和所有必需的组件,以使它们出现在控制面板的“程序和功能”中

Programs and Features

然后,您在注册表中搜索程序和功能中出现的名称

Registry

您要查找包含该名称的值DisplayName。您可以在

的一个键中找到它
  

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \,   HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall \

  

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall

,取决于安装类型。

注意:如果对应键中的SystemComponent值为1,则可以从“程序和功能”中隐藏某些组件。

然后您可以在pascal脚本中使用类似这样的命令来检查注册表项的存在

[Code]
function test(bitness: integer; productCode: String): Boolean;
begin
    if RegValueExists(bitness, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + productCode, 'DisplayName') then Result := True else Result := False;
end;

您可以在函数PrepareToInstall(var NeedsRestart:Boolean):String;中调用此函数。或使用检查参数(搜索inno设置帮助)