Betriebssystem erkennen

Wolfgang Kluge
wolfgang@vbwelt.de

Auch in Zeiten der Kompatibilität gibt es einige Inkompatibilitäten zwischen den Microsoft-Betriebssystemen.
Das kann zu großen Hängern im Programm führen, vor allem dann, wenn es sich um Programme handelt, die viel mit der Registry machen, oder solche, die am Dateisystem etwas herumspielen. Auch bei der Grafikausgabe gibt es viele unterschiede zwischen NT und 95/98.

Mit Windows2000 und WindowsXP(2002) kommen noch zwei dazu, welche ja bekanntermaßen alle Vorteile von NT und 98 zusammengepackt in einem sind. Das wirkt sich in vielen neuen API-Funktionen aus, die man unter Win9x lieber nicht verwenden sollte (allein der Versuch ist strafbar*g*).

Mit Hilfe einer kleinen API-Funktion bekommt man eigentlich alles, was für das Betriebssystem wichtig ist...Angefangen von der Versionsnummer bis hin zum installierten Service Pack..


 Deklaration:
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type
Private Const VER_PLATFORM_WIN32_NT = 2
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32s = 0


Um die angeforderten Informationen nun auszuwerten braucht es noch einiger Informationen. So erhält man mit der PlatformID nicht etwa direkt das Betriebssystem(außer NT) sondern einen Hinweiß auf dieses. Bei Windows 95/98 muß danach noch die Versionsnummer untersucht werden. So ist Windows 98 immer mit einer x.10 gesegnet.

Im Array .szCSDVersion aus der OSVERSIONINFO-Struktur stehen dann solche Sachen wie die Version des ServicePacks. Das Array ist mit Chr(0) getrennt und wird hier mit der Funktion Split() auseinandergenommen. Diese Funktion ist aber erst seit Version 6 von VB verfügbar (ist aber kein Grund für mich darauf zu verzichten...).

Wenn man die Funktion auch unter VB5 bzw. 4 haben will, dann sollte man sich das Modul "VB6 Modul" unter Tools mal anschauen.

' Betriebssystem mit Informationen
Dim OSinfo As OSVERSIONINFO, CSDArray() As String, CSD As String, tmp
OSinfo.dwOSVersionInfoSize = Len(OSinfo)
GetVersionEx OSinfo

With OSinfo
  Select Case .dwPlatformId
    Case VER_PLATFORM_WIN32s
      OS = "Windows 16bit mit 32bit-Erweiterung"
    Case VER_PLATFORM_WIN32_WINDOWS
      OS = "Windows"
      Select Case .dwMinorVersion
        Case 0
          OS = OS & " 95"
        Case 10
          OS = OS & " 98"
        Case 90
          OS = OS & " ME"
        Case Else
          OS = OS & " (unbekannt)"
      End Select
    Case VER_PLATFORM_WIN32_NT
      OS = "Windows NT"
      If .dwMajorVersion = 5 Then
        Select Case .dwMinorVersion
          Case 0
            OS = OS & "5.0 (Win2000)"
          Case 1
            OS = OS & "5.1 (WinXP)"
        End Select
      End If
    Case Else
      OS = "Betriebssystem unbekannt"
  End Select

  CSDArray() = Split(.szCSDVersion, Chr(0))
  For Each tmp In CSDArray()
    If tmp <> "" Then CSD = CSD & tmp & " "
  Next

  OS = OS & " ( Version " & .dwMajorVersion & "." & .dwMinorVersion & ", " & CSD & ")"
End With

MsgBox OS