Bestem Windows version i Inno Setup

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger Inno Setup til at ændre papirkurven i operativsystemet. Jeg skal gøre nogle tilfælde, hvis brugeren kører Windows 7 eller Windows XP. Jeg prøver at bruge:


if not FileExists(winDir + 'System32imageres.dll') then
  if not FileExists(winDir + 'System32shell32.dll') then
    installError(3);


Men det ser ud til, at det ikke kan finde imageres.dll eller shell32.dll, selvom jeg har bekræftet, at de eksisterer. Hvad gør jeg forkert? Eller kan jeg kontrollere Windows-versionen på en anden måde?

Bedste reference


Du skal bruge funktionen GetWindowsVersionEx. Det fylder en TWindowsVersion rekord: [17] [18]


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;


Der er mange andre relaterede funktioner. Se nedenfor 'Systemfunktioner' på denne side. [19]

Andre referencer 1


Ifølge dokumentationen kan parametrene forbundet med hver fil være direkte bundet til OS-versionen: [20]


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


'0' betyder aldrig installere; '1' betyder installering på enhver version (dvs. version 1.0 eller nyere).


Bemærk: Ovennævnte teknik er ikke begrænset til sektionen [[Filer]]; MinVersion og OnlyBelowVersion kan bruges i de fleste afsnit.

Andre referencer 2


I de fleste sektioner af Inno Setup (som [Files], [Tasks], [Run] osv.) Kan du bruge de MinVersion og OnlyBelowVersion fælles parametre. [21]]]


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





I Pascal script skal du bruge funktionen GetWindowsVersionEx til at finde Windows versionsnummer. Sammenlign derefter nummeret med et bestemt Windows-versionsnummer. [22] [23]


Her er nogle få praktiske funktioner til at kontrollere bestemte Windows-versioner:




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;


Eksempel på brug:


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;