Определить версию Windows в Inno Setup - PullRequest
3 голосов
/ 01 мая 2011

Я использую Inno Setup, чтобы изменить корзину в ОС.Мне нужно сделать несколько случаев, если пользователь работает под управлением Windows 7 или Windows XP.Я пытаюсь использовать:

if not FileExists(winDir + '\System32\imageres.dll') then
  if not FileExists(winDir + '\System32\shell32.dll') then
    installError(3);

Но кажется, что он не может найти imageres.dll или shell32.dll, даже если я убедился, что они существуют.Что я делаю неправильно?Или я могу проверить версию Windows по-другому?

Ответы [ 3 ]

8 голосов
/ 01 мая 2011

Вы должны использовать функцию GetWindowsVersionEx.Он заполняет запись TWindowsVersion:

TWindowsVersion = record
  Major: Cardinal;             // Major version number
  Minor: Cardinal;             // Minor version number
  Build: Cardinal;             // Build number
  ServicePackMajor: Cardinal;  // Major version number of service pack
  ServicePackMinor: Cardinal;  // Minor version number of service pack
  NTPlatform: Boolean;         // True if an NT-based platform
  ProductType: Byte;           // Product type (see below)
  SuiteMask: Word;             // Product suites installed (see below)
end;

Существует множество других связанных функций.См. Ниже «Системные функции» на этой странице .

7 голосов
/ 10 июля 2016

В большинстве разделов Inno Setup (например, [Files], [Tasks], [Run] и т. Д.) Можно использовать общие параметры MinVersion и OnlyBelowVersion .

[Files]
Source: MyDllForVistaAndNewer.dll; Dest: {app}\MyDll.dll; MinVersion: 6.0
Source: MyDllForOldWindows.dll; Dest: {app}\MyDll.dll; OnlyBelowVersion: 6.0

В Pascal Script используйте функцию GetWindowsVersionEx, чтобы найти номер версии Windows. Затем сравните число с конкретным номером версии Windows .

Вот несколько удобных функций для проверки конкретных версий Windows:

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 IsWindowsXPOrNewer: Boolean;
begin
  Result := IsWindowsVersionOrNewer(5, 1);
end;

function IsWindowsVistaOrNewer: Boolean;
begin
  Result := IsWindowsVersionOrNewer(6, 0);
end;

function IsWindows7OrNewer: Boolean;
begin
  Result := IsWindowsVersionOrNewer(6, 1);
end;

function IsWindows8OrNewer: Boolean;
begin
  Result := IsWindowsVersionOrNewer(6, 2);
end;

function IsWindows10OrNewer: Boolean;
begin
  Result := IsWindowsVersionOrNewer(10, 0);
end;

Пример использования:

function InitializeSetup: Boolean;
begin
  if not IsWindowsVistaOrNewer then
  begin 
    MsgBox(
      'This program was not tested on Windows XP and older, proceed with caution.',
      mbCriticalError, MB_OK);
  end;  

  Result := True;
end;

Чтобы проверить серверные версии Windows, см .:
Проверка для Windows Server 2003

7 голосов
/ 01 мая 2011

Согласно документации , параметры, связанные с каждым файлом, могут быть напрямую связаны с версией ОС:

[Files]
Source: "{app}\WinNT2000XP.exe"; DestDir: "{app}"; MinVersion: 0, 1
Source: "{app}\Win9598Me.exe"; DestDir: "{app}"; MinVersion: 1, 0

"0" означает никогда не устанавливать;«1» означает установку в любой версии (т. Е. В версии 1.0 или более поздней).

Примечание. Приведенный выше метод не ограничивается разделом [Files];MinVersion и OnlyBelowVersion могут использоваться в большинстве разделов.

...