Windows-Versionsinformationen unter Visual Basic ermitteln

Veröffentlicht: 03. Apr 2002 | Aktualisiert: 21. Jun 2004

Von Mathias Schiffer

So finden Sie heraus, auf welcher Windows-Version Ihre Anwendung beim Endanwender läuft.

Viele API-Funktionen und andere Funktionen können nur unter bestimmten Windows-Versionen verwendet werden.
In der Dokumentation des Platform SDK
ist für API-Funktionen beschrieben, welche Anforderungen sie an die Windows-Version stellt.Für Sie bedeutet das konkret, dass Sie solche Funktionen nur dann aufrufen sollten, wenn Ihre Anwendung auf einer entsprechenden Windows-Version läuft. Für andere Windows-Versionen müssen Sie sich bei Bedarf nach alternativen Möglichkeiten umsehen, um die gewünschte Funktionalität zu erreichen.
Ihre Anwendung kann über die Windows-API-Funktion GetVersionEx
die Windows-Version herausfinden. Sie füllt die übergebene OSVERSIONINFO-Struktur mit versionsspezifischen Informationen:

' Werte für dwPlatformId von OSVERSIONINFO 
Private Const VER_PLATFORM_WIN32s        As Long = 0& 
Private Const VER_PLATFORM_WIN32_WINDOWS As Long = 1& 
Private Const VER_PLATFORM_WIN32_NT      As Long = 2& 
Private Type OSVERSIONINFO 
  dwOSVersionInfoSize As Long   ' Größe der Struktur 
  dwMajorVersion      As Long   ' Major-Versionsnummer 
  dwMinorVersion      As Long   ' Minor-Versionsnummer 
  dwBuildNumber       As Long   ' Build-Versionsnummer 
  dwPlatformId        As Long   ' Plattform-Kennzeichner 
  szCSDVersion        As String * 128 ' Service Pack (Klartext) 
End Type 
' Abrufen der Windows-Versionsinformationen: 
Private Declare Function GetVersionEx _ 
  Lib "kernel32" Alias "GetVersionExA" ( _ 
  ByRef VersionInformation As OSVERSIONINFO _ 
  ) As Long

Vor dem Aufruf der Funktion GetVersionEx müssen Sie im Parameter dwOSVersionInfoSize der OSVERSIONINFO-Struktur angeben, wie groß die Struktur ist – dies erreichen Sie über die Funktion Len:

Dim OSVI As OSVERSIONINFO 
Dim lSuccess As Long 
  ' Größe der OSVERSIONINFO-Struktur angeben 
  OSVI.dwOSVersionInfoSize = Len(OSVI) 
  ' Abruf der Windows-Versionsinformationen 
  lSuccess = GetVersionEx(OSVI)

War der Abruf der Versionsinformationen erfolgreich, liefert GetVersionEx einen Wert ungleich 0 zurück.

Die nun in die Struktur OSVERSIONINFO übergebenen Daten ermöglichen Ihnen die Identifizierung der Windows-Version: Die Parameter dwMajorVersion, dwMinorVersion und dwBuildNumber sind selbsterklärend – sie enthalten die Windows-Versionsnummer. Allerdings wird kaum jemand Windows XP unter dem Namen
"Windows 5.1" kennen: Die folgende Tabelle ordnet die verschiedenen Versionsnummern den geläufigeren Produktnamen zu:

OS

Win95

Win98

WinME

WinNT3.51

WinNT 4.0

Win2000

WinXP

dwPlatformID

1

1

1

2

2

2

2

dwMajorVersion

4

4

4

3

4

5

5

dwMinorVersion

0

10

90

51

0

0

1

In dieser Tabelle enthalten sind auch die Werte für den Parameter dwPlatformID: Er kennzeichnet die Basis-Technologie einer Windows-Version. Mögliche Werte sind hier VER_PLATFORM_WIN32s (Win32s-Erweiterungen für Windows 3.x), VER_PLATFORM_WIN32_WINDOWS (auf MS-DOS aufsetzende Windows-Versionen) sowie VER_PLATFORM_WIN32_NT (Windows NT, 2000 und XP).

Letztlich findet sich im Parameter szCSDVersion ggf. eine Klartextbeschreibung des installierten Service-Packs, beispielsweise
"Service Pack 2".

Mit diesen Informationen gerüstet können wir eine einfache Fallunterscheidung vornehmen, um die eingesetzte Windows-Version zu erkennen:

Private Function GetWindowsVersion() As String 
Dim OSVI As OSVERSIONINFO 
Dim lSuccess As Long 
  ' Größe der OSVERSIONINFO-Struktur angeben 
  OSVI.dwOSVersionInfoSize = Len(OSVI) 
  ' Abruf der Windows-Versionsinformationen 
  lSuccess = GetVersionEx(OSVI) 
  ' Erfolgreiche Abarbeitung überprüfen 
  If lSuccess = 0 Then 
    Exit Function 
  End If 
  ' Auswertung der Versionsnummern: 
  Select Case OSVI.dwPlatformId ' Plattform-Kennzeichner 
    Case VER_PLATFORM_WIN32s ' Win32s-Erweiterung 
      GetWindowsVersion = "Win32s für Windows 3.x" 
    Case VER_PLATFORM_WIN32_WINDOWS ' Windows 9x/Me 
      Select Case OSVI.dwMinorVersion 
        Case 0 
          GetWindowsVersion = "Windows 95" 
        Case 10 
          GetWindowsVersion = "Windows 98" 
        Case 90 
          GetWindowsVersion = "Windows Me" 
      End Select 
    Case VER_PLATFORM_WIN32_NT ' Windows NT/2000/XP 
      Select Case OSVI.dwMajorVersion 
        Case 3 
          GetWindowsVersion = "Windows NT 3." & CStr(OSVI.dwMinorVersion) 
        Case 4 
          GetWindowsVersion = "Windows NT 4.0" 
        Case 5 
          Select Case OSVI.dwMinorVersion 
            Case 0 
              GetWindowsVersion = "Windows 2000" 
            Case 1 
              GetWindowsVersion = "Windows XP" 
          End Select 
        Case Else ' zukünftige Versionen von Windows NT 
          GetWindowsVersion = "Windows NT / Folgeversion" 
      End Select 
  End Select 
End Function