DruckenMister WongFacebook

Windows-Version ermitteln

System Win9x, WinNT, Win2000, WinXP, Vista, Win7
Ab Delphi-Version Delphi 1
Letzte Änderung 28.09.2010

Dieser Artikel zeigt, wie die verwendete Windows-Version ermittelt werden kann. Dafür wird die Systemfunktion GetVersionEx verwendet. Ab Windows 2000 können weitergehende Informationen mit der Struktur OSVERSIONINFOEX abgerufen werden. Für ältere Windows-Versionen wird auf die Struktur OSVERSIONINFO zurückgegriffen.

Als erstes müssen die neue Struktur, verwendete Konstanten und Systemfunktionen bekannt gemacht werden:


type
  //http://msdn2.microsoft.com/en-us/library/ms724833.aspx
  TOSVersionInfoEx = packed record
    dwOSVersionInfoSize : DWORD;
    dwMajorVersion      : DWORD;
    dwMinorVersion      : DWORD;
    dwBuildNumber       : DWORD;
    dwPlatformId        : DWORD;
    szCSDVersion        : array[0..127] of Char;
    wServicePackMajor   : WORD;
    wServicePackMinor   : WORD;
    wSuiteMask          : WORD;
    wProductType        : BYTE;
    wReserved           : BYTE;
  end;

const
  VER_SUITE_PERSONAL  = $00000200;
  VER_NT_WORKSTATION  = $00000001;
  VER_SUITE_WH_SERVER = $00008000;
  SM_SERVERR2         = 89;

function GetOSVersionEx(var lpVersionInformation: TOSVersionInfoEx): BOOL; stdcall; external kernel32 name
'GetVersionExA';
 

Eine Hilfsfunktion fragt die Systeminformationen ab:


function GetOSVersionInfoEx : TOSVersionInfoEx;
var
  OSVersionInfo   : TOSVersionInfo absolute Result;
  Done : Boolean;
begin
  FillChar(Result, SizeOf(Result), #0);
  Done := False;
  try
    Result.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx);
    Done := GetOSVersionEx(Result);
  except
  end;
  if not(Done) then
  begin
    try
      FillChar(Result, SizeOf(Result), #0);
      Result.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
      Done := GetVersionEx(OSVersionInfo);
    except
    end;
  end;
end;
 

Folgende Funktion ordnet diese Informationen einem entsprechenden Betriebssystem zu:


function GetWinVersion : string;
var
  OSInfo : TOSVersionInfoEx;
begin
  Result := 'Unbekannte Windows-Version';
  OSInfo := GetOSVersionInfoEx;
  case OSInfo.dwPlatformId of
    VER_PLATFORM_WIN32s:
    begin
      Result := 'Win32s';
    end;
    VER_PLATFORM_WIN32_WINDOWS:
    begin
      if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion0) then
        Result := 'Windows 95';
      if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 10) then
        Result := 'Windows 98';
      if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 90) then
        Result := 'Windows Millennium Edition';
    end;
    VER_PLATFORM_WIN32_NT:
    begin
      if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 0) then
        Result := 'Windows NT';
      if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 0) then
        Result := 'Windows 2000';
      if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 1) then
        Result := 'Windows XP';

      if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 2) then
      begin
        if GetSystemMetrics(SM_SERVERR2) <> 0 then
          Result := 'Windows Server 2003 "R2"'
         else
           if (OSInfo.wProductType = VER_NT_WORKSTATION) then
             Result := 'Windows XP x64'
           else
             if OSInfo.wSuiteMask = VER_SUITE_WH_SERVER then
               Result := 'Windows Home Server'
             else
               Result := 'Windows Server 2003';
      end;
      if (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 0) then
      begin
        if (OSInfo.wProductType = VER_NT_WORKSTATION) then
          Result := 'Windows Vista'
        else
          Result := 'Windows Server 2008';
      end;
      if (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 1) then
      begin
        if (OSInfo.wProductType = VER_NT_WORKSTATION) then
          Result := 'Windows 7'
        else
          Result := 'Windows Server 2008 R2';
      end;
      if (OSInfo.wSuiteMask and VER_SUITE_PERSONAL) = VER_SUITE_PERSONAL then
        Result := Result + ' Home Edition'
      else
        Result := Result + ' Professional';
    end;
  end;
  Result := Trim(Result + ' ' + OSInfo.szCSDVersion);
end;
 

Eine Dokumentation zu den verwendeten Versionsnummer befindet sich im MSDN. Diese Liste wird mit neuen Windows-Versionen ergänzt. Damit lässt sich die Funktion GetWinVersion leicht erweitern und vervollständigen.

Alternativ können auch die globalen Variablen aus der Unit SysUtils verwendet werden, worüber sich die Produktlinie (Win32Platform - W9X oder NT), die Major (Win32MajorVersion), Minor (Win32MinorVersion), sowie die Buildnummer (Win32BuildNumber) ermitteln lassen. Eine weitere Variable enthält Informationen über evtl. installierte Servicepacks (Win32CSDVersion). Eine ähnliche Funktion befindet sich auch in der JCL in der Unit JCLSysInfo und trägt den Namen GetWindowsVersion bzw. GetWindowsVersionString.