Inno Setup Функция проверки версии Windows

Хамик

Старожил
У кого есть возможность проверить код на разных версиях Windows, правильно ли условия прописаны? Потребовалось в секции code, для удобства, аналог MinVersion и OnlyBelowVersion.
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Ap

[code]
function IsWindowsVersion(MinVerMajor, MinVerMinor, OnlyBelowVerMajor, OnlyBelowVerMinor: Integer): Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);

  if ((MinVerMajor > 0) and (OnlyBelowVerMajor > 0)) then
  Result := ((Version.Major >= MinVerMajor) and (Version.Minor >= MinVerMinor)) and ((Version.Major < OnlyBelowVerMajor) and (Version.Minor < OnlyBelowVerMinor)) else

  if ((MinVerMajor > 0) and (OnlyBelowVerMajor = 0)) then
  Result := (Version.Major > MinVerMajor) or ((Version.Major = MinVerMajor) and (Version.Minor >= MinVerMinor)) else

  if ((MinVerMajor = 0) and (OnlyBelowVerMajor > 0)) then
  Result := ((Version.Major < OnlyBelowVerMajor) or ((Version.Major < OnlyBelowVerMajor) and (Version.Minor < OnlyBelowVerMinor)));
end;

function InitializeSetup(): Boolean;
begin
  Result := IsWindowsVersion(10, 0, 0, 0);
end;
 

Хамик

Старожил
Win 11. Не запускается.
Что у вас выведет сообщение:
Добавьте в конец функции iswindowsversion.
Код:
Msgbox(inttostr(version.major)+'.'+inttostr(version.minor), mbinformation, mb_OK);
По логике должен запускаться
Windows Versions
6.0.6000Windows Vista
6.0.6001Windows Vista with Service Pack 1
or Windows Server 2008
6.1.7600Windows 7
or Windows Server 2008 R2
6.1.7601Windows 7 with Service Pack 1
or Windows Server 2008 R2 with Service Pack 1
6.2.9200Windows 8
or Windows Server 2012
6.3.9200Windows 8.1
or Windows Server 2012 R2
6.3.9600Windows 8.1 with Update 1
10.0.10240Windows 10 Version 1507
10.0.10586Windows 10 Version 1511 (November Update)
10.0.14393Windows 10 Version 1607 (Anniversary Update)
or Windows Server 2016
10.0.15063Windows 10 Version 1703 (Creators Update)
10.0.16299Windows 10 Version 1709 (Fall Creators Update)
10.0.17134Windows 10 Version 1803 (April 2018 Update)
10.0.17763Windows 10 Version 1809 (October 2018 Update)
or Windows Server 2019
10.0.18362Windows 10 Version 1903 (May 2019 Update)
10.0.18363Windows 10 Version 1909 (November 2019 Update)
10.0.19041Windows 10 Version 2004 (May 2020 Update)
10.0.19042Windows 10 Version 20H2 (October 2020 Update)
10.0.19043Windows 10 Version 21H1 (May 2021 Update)
10.0.19044Windows 10 Version 21H2 (November 2021 Update)
10.0.20348Windows Server 2022 Version 21H2
10.0.22000Windows 11 Version 21H2 (N/A)
Note that there is normally no need to specify the build numbers (i.e., you may simply use "6.2" for Windows 8).
 
Последнее редактирование:

Хамик

Старожил
А почему он не должен запуститься?
Установщик предупредил о версии и продолжил работу.
Вы же не установили критерии запуска в InitializeSetup...
В данном примере критерией служит запуск на вин 10 и выше иначе - нет запуска. Такой был замысел, поэтому прошу протестировать у кого какая винда, желательно "поиграться" циферками. Если что-то не так, то попробовать подправить код, чтобы отработал правильно. Тем более @volente написал, что на вин11 не работает. Здесь уже возникает вопрос на фоне других тестов на вин11, либо человек от "фонаря" написал, либо действительно в коде ошибка.
 

Andreo Fadio

Старожил
В данном примере критерией служит запуск на вин 10 и выше иначе - нет запуска.
а чем вас тогда более старая функция не устроила? (из расширенной справки для IS) Тоже самое делает.
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.\

[code]
function IsWindowsVersionOrNewer(Major, Minor: Integer): Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);
  Result:= (Version.Major > Major) or ((Version.Major = Major) and (Version.Minor >= Minor));
end;

function InitializeSetup(): Boolean;
begin
if IsWindowsVersionOrNewer(10, 0) then
  Result:= True else
MsgBox('Версия Windows не соответствует требуемым параметрам', mbError, MB_OK);
end;
 

Хамик

Старожил
@Andreo Fadio, вопрос в реализации параметров Minversion и Onlybelowversion в секции [cоde]. Пример с запуском для удобства тестирования. Для своего удобства решил компактней реализовать данную затею.
 

SBalykov

Старожил
@Andreo Fadio, вопрос в реализации параметров Minversion и Onlybelowversion в секции [cоde]. Пример с запуском для удобства тестирования. Для своего удобства решил компактней реализовать данную затею.
screenshot 2022-05-13 001.png
Код выхода из установки: 1 - установка не инициализировалась
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Ap

Код:
function IsWindowsVersion(MinVerMajor, MinVerMinor, OnlyBelowVerMajor, OnlyBelowVerMinor: Integer): Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);

  if ((MinVerMajor > 0) and (OnlyBelowVerMajor > 0)) then
  Result := ((Version.Major >= MinVerMajor) and (Version.Minor >= MinVerMinor)) and ((Version.Major < OnlyBelowVerMajor) and (Version.Minor < OnlyBelowVerMinor)) else

  if ((MinVerMajor > 0) and (OnlyBelowVerMajor = 0)) then
  Result := (Version.Major > MinVerMajor) or ((Version.Major = MinVerMajor) and (Version.Minor >= MinVerMinor)) else

  if ((MinVerMajor = 0) and (OnlyBelowVerMajor > 0)) then
  Result := ((Version.Major < OnlyBelowVerMajor) or ((Version.Major < OnlyBelowVerMajor) and (Version.Minor < OnlyBelowVerMinor)));
end;

function InitializeSetup(): Boolean;
begin
   if Result = IsWindowsVersion(11, 0, 0, 0) then
   MsgBox('Версия Windows не соответствует требуемым параметрам', mbError, MB_OK) else
   Result := True;
end;
 
Последнее редактирование:
Сверху