我需要为使用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;
看起来好像没有检查框架是否已经存在或可能已经安装了哪个版本。
用于查找先前安装的版本的模式是什么,如果存在,则检查版本,如果该版本较旧或不存在,则进行安装?
答案 0 :(得分:1)
这是一个简单的答案,可以带您进入许多可能的解决方案之一。
在测试环境(或您的计算机)中,安装应用程序和所有必需的组件,以使它们出现在控制面板的“程序和功能”中
然后,您在注册表中搜索程序和功能中出现的名称
您要查找包含该名称的值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设置帮助)