|
Auf den ersten Blick ziemlich undurchsichtig sind die Informationen, die Ihnen die API-Funktion GetVersionEx über das installierte Betriebssystem liefert. Womöglich kann selbst bei Microsoft niemand mehr so richtig nachvollziehen, warum sich sowohl alle Windows 9x-Versionen als auch NT 4.0 als Hauptversion 4 zu erkennen geben. Wahrscheinlich rührt das aus dem ursprünglich für einen viel früheren Zeitpunkt geplanten Zusammenwachsen der Betriebssysteme auf der Basis eines gemeinsamen Kerns. Dieses Vorhaben wird schließlich erst mit dem kommenden Windows XP endgültig umgesetzt.
Aus der Kombination der Hauptversion (Major) und der Unterversion (Minor) mit der Plattform-Kennung (PlatformId - 32s, 9x oder NT) ergibt sich die tatsächliche Betriebssystem-Version.
Im Prinzip reicht es, von der API-Funktion GetVersionEx die benutzerdefinierte Variable OSVERSIONINFO füllen zu lassen. Sie umfasst bereits alle zur Bestimmung des Betriebssystems notwendigen Informationen. Ein wenig mehr können allerdings die neueren Windows-Versionen über sich erzählen: Windows 2000 und Windows XP - und auch schon Windows NT 4.0 ab ServicePack 6. Die um die erweiterten Informationen größere benutzerdefinierte Variable OSVERSIONINFOEX kann auch erst unter diesen Versionen an GetVersionEx übergeben werden. Und gerade sie bietet erst eine systematischere Unterscheidung der ServicePack-Stufe, sogar wiederum mit einer getrennten Kennung Haupt- und Unterversion, wie Sie sie eigentlich schon unter NT 4.0 brauchen könnten, um das Vorhandensein des ServicePack 6 feststellen zu können.
Eine etwas vage anmutende Information können Sie dazu jedoch auch schon über OSVERSIONINFO in Erfahrung bringen. Im Element szCSDVersion (einem String der festen Länge 128) werden nämlich Zusatzinformationen geliefert - unter Windows 9x eine Kennung für die Release-Version (OSR, Second Edition usw.) und unter NT/2000 die ServicePack-Stufe im Klartext. Zumindest unter NT 4.0 können sich Sie sich wohl darauf verlassen, dass die Nummer des ServicePacks mit dem 14. Zeichen beginnt.
Wir haben für Sie die Auswertung der Einzelinformationen in ein Standard-Modul gepackt. Sie initialisieren es einmal mit dem Aufruf der Prozedur ReadVersionInfo, in der mittels GetVersionEx die Informationen einmal eingelesen werden. Über eine ganze Reihe von Eigenschaften können Sie nun die Details auslesen. Zum einen entspricht jeweils eine Eigenschaft einem jeden Element von OSVERSIONINFOEX. Für den Fall, dass GetVersionEx jedoch nicht damit aufgerufen werden konnte, sondern lediglich mit OSVERSIONINFO, wird deren Inhalt einer modulweit gültigen Variablen des Typs OSVERSIONINFOEX per LSet zugewiesen. Zum anderen bietet das Modul eine direkte Möglichkeit, die Windows-Version als enumerierten Wert aus der Eigenschaft WinVersion auszulesen, als auch als Klartext aus der Eigenschaft WinVersionText. Schließlich können Sie noch über separate Eigenschaften für jede Betriebssystem-Version erfragen, ob die jeweilige Version installiert ist.
Private Declare Function GetVersionEx Lib "kernel32" _
Alias "GetVersionExA" (lpVersionInformation As Any) 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 Type OSVERSIONINFOEX
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
wServicePackMajor As Integer
wServicePackMinor As Integer
wSuiteMask As Integer
wProductType As Byte
wReserved As Byte
End Type
Private mVersionInfoEx As OSVERSIONINFOEX
Public Enum viMajorConstants
viMajorWindowsNT351 = 3
viMajorWindows9x_NT4 = 4
viMajorWindows2000_XP = 5
End Enum
Public Enum viMinorConstants
viMinorWindows95_NT4_2000 = 0
viMinorXP = 1
viMinorWindows98 = 10
viMinorWindowsNT351 = 51
viMinorWindowsMe = 90
End Enum
Public Enum viPlatformIdConstants
viPlatformWIN32s = 0
viPlatformWIN32_9x = 1
viPlatformWIN32_NT = 2
End Enum
Public Enum viProductTypeConstants
viPTWorkstation = 1
viPTDomainController = 2
viPTServer = 3
End Enum
Public Enum viSuiteMaskConstants
viSMSmallBusiness = &H1
viSMEnterprise = &H2
viSMBackOffice = &H4
viSMCommunications = &H8
viSMTerminal = &H10
viSMSmallBusinessRestricted = &H20
viSMEmbeddedNT = &H40
viSMDataCenter = &H80
End Enum
Public Enum viWinVersionConstants
viWinUnknown = 0
viWin95 = 1
viWin98 = 2
viWinME = 3
viWinNT351 = 4
viWinNT4 = 5
viWin2000 = 6
viWinXP = 7
End Enum
Private pCSDVersion As String
Public Property Get BuildNumber() As Long
BuildNumber = mVersionInfoEx.dwBuildNumber
End Property
Public Property Get CSDVersion() As String
CSDVersion = pCSDVersion
End Property
Public Property Get Major() As viMajorConstants
Major = mVersionInfoEx.dwMajorVersion
End Property
Public Property Get Minor() As viMinorConstants
Minor = mVersionInfoEx.dwMinorVersion
End Property
Public Property Get PlatformId() As Long
PlatformId = mVersionInfoEx.dwPlatformId
End Property
Public Property Get ProductType() As Byte
ProductType = mVersionInfoEx.wProductType
End Property
Public Property Get SPMajor() As Integer
SPMajor = mVersionInfoEx.wServicePackMajor
End Property
Public Property Get SPMinor() As Integer
SPMinor = mVersionInfoEx.wServicePackMinor
End Property
Public Property Get SuiteMask() As Integer
SuiteMask = mVersionInfoEx.wSuiteMask
End Property
Public Property Get Win95() As Boolean
With mVersionInfoEx
Win95 = (.dwMajorVersion = viMajorWindows9x_NT4) _
And (.dwMinorVersion = viMinorWindows95_NT4_2000) _
And (.dwPlatformId = viPlatformWIN32_9x)
End With
End Property
Public Property Get Win98() As Boolean
With mVersionInfoEx
Win98 = (.dwMajorVersion = viMajorWindows9x_NT4) _
And (.dwMinorVersion = viMinorWindows98) _
And (.dwPlatformId = viPlatformWIN32_9x)
End With
End Property
Public Property Get WinME() As Boolean
With mVersionInfoEx
WinME = (.dwMajorVersion = viMajorWindows9x_NT4) _
And (.dwMinorVersion = viMinorWindowsMe) _
And (.dwPlatformId = viPlatformWIN32_9x)
End With
End Property
Public Property Get WinNT351() As Boolean
With mVersionInfoEx
WinNT351 = (.dwMajorVersion = viMajorWindowsNT351) _
And (.dwMinorVersion = viMinorWindowsNT351) _
And (.dwPlatformId = viPlatformWIN32_NT)
End With
End Property
Public Property Get WinNT4() As Boolean
With mVersionInfoEx
WinNT4 = (.dwMajorVersion = viMajorWindows9x_NT4) _
And (.dwMinorVersion = viMinorWindows95_NT4_2000) _
And (.dwPlatformId = viPlatformWIN32_NT)
End With
End Property
Public Property Get Win2000() As Boolean
With mVersionInfoEx
Win2000 = (.dwMajorVersion = viMajorWindows2000_XP) _
And (.dwMinorVersion = viMinorWindows95_NT4_2000) _
And (.dwPlatformId = viPlatformWIN32_NT)
End With
End Property
Public Property Get WinXP() As Boolean
With mVersionInfoEx
WinXP = (.dwMajorVersion = viMajorWindows2000_XP) _
And (.dwMinorVersion = viMinorXP) _
And (.dwPlatformId = viPlatformWIN32_NT)
End With
End Property
Public Property Get WinVersion() As viWinVersionConstants
Select Case True
Case Win95
WinVersion = viWin95
Case Win98
WinVersion = viWin98
Case WinME
WinVersion = viWinME
Case WinNT351
WinVersion = viWinNT351
Case WinNT4
WinVersion = viWinNT4
Case Win2000
WinVersion = viWin2000
Case WinXP
WinVersion = viWinXP
End Select
End Property
Public Property Get WinVersionText() As String
Select Case True
Case Win95
WinVersionText = "Windows 95 (" & pCSDVersion & ")"
Case Win98
WinVersionText = "Windows 98 (" & pCSDVersion & ")"
Case WinME
WinVersionText = "Windows ME (" & pCSDVersion & ")"
Case WinNT351
WinVersionText = "Windows NT 3.51 (" & pCSDVersion & ")"
Case WinNT4
WinVersionText = "Windows NT 4.0 (" & pCSDVersion & ")"
Case Win2000
WinVersionText = "Windows 2000 (" & pCSDVersion & ")"
Case WinXP
WinVersionText = "Windows XP (" & pCSDVersion & ")"
End Select
End Property
Public Sub ReadVersionInfo()
Dim nVersionInfo As OSVERSIONINFO
Dim nPos As Long
With nVersionInfo
.dwOSVersionInfoSize = Len(nVersionInfo)
GetVersionEx nVersionInfo
nPos = InStr(.szCSDVersion, Chr$(0))
If nPos Then
pCSDVersion = Trim$(Left$(.szCSDVersion, nPos - 1))
Else
pCSDVersion = Trim$(.szCSDVersion)
End If
If (.dwPlatformId = viPlatformWIN32_NT) _
And (.dwMajorVersion = viMajorWindows2000_XP) Then
ElseIf (.dwPlatformId = viPlatformWIN32_NT) _
And (.dwMajorVersion = viMajorWindows9x_NT4) _
And (CLng(Mid$(pCSDVersion, 14)) > 5) Then
Else
LSet mVersionInfoEx = nVersionInfo
Exit Sub
End If
End With
mVersionInfoEx.dwOSVersionInfoSize = Len(mVersionInfoEx)
GetVersionEx mVersionInfoEx
End Sub
|