VB 5/6-Tipp 0129: Laufendes Betriebssystem ermitteln
von ActiveVB
Beschreibung
Windows 95, 98 bzw. NT, 2000 oder XP, manchmal muss man wissen, welches nun das aktuell laufende System ist. Die Ermittlung ist aber recht einfach.
Update am 23. September 2004 von Konrad Rudploh (konrad@activevb.de): Nach einer Idee von Kai Liebenau werden nun mehr Versionen erkannt.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: GetVersionExA (GetVersionEx1), GetVersionExA (GetVersionEx2) | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Beschriftungsfeld "Label1" ' Danke an Heino für den Tipp zum Erkennen, ob es sich um ein ' Windows 2000 System handelt. ' Danke an Jürgen für den Tipp zum Erkennen, ob es sich um ein ' Windows ME System handelt. Option Explicit ' Datentypen Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 ' Service Pack End Type Private Type OSVERSIONINFOEX dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 ' Service Pack wServicePackMajor As Integer wServicePackMinor As Integer wSuiteMask As Integer wProductType As Byte wReserved As Byte End Type ' Enumerationen Public Enum WindowsVersion WIN_OLD WIN_95 WIN_98 WIN_ME WIN_NT_3x WIN_NT_4x WIN_2K WIN_XP WIN_XP_HOME WIN_2003 End Enum ' WinAPI Private Declare Function GetVersionEx1 Lib "kernel32.dll" Alias _ "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO _ ) As Long Private Declare Function GetVersionEx2 Lib "kernel32.dll" Alias _ "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFOEX _ ) As Long ' Konstanten 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& ' Um zu testen, ob XP Home oder Professional verwendet wird. ' Weitere Informationen gibt es unter ' ' http://msdn.microsoft.com/library/en-us/sysinfo/base/getversionex.asp ' ' http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ -> ' sysinfo/base/osversioninfoex_str.asp Private Const VER_SUITE_PERSONAL As Long = &H200& ' Private Variablen Private m_bAlreadyGot As Boolean Private m_OsVersion As WindowsVersion Private Sub Command1_Click() Unload Me End Sub Private Sub Form_Load() Select Case GetOSVersion Case WIN_OLD Label1 = "Windows 32s" Case WIN_95 Label1 = "Windows 95" Case WIN_98 Label1 = "Windows 98" Case WIN_ME Label1 = "Windows ME" Case WIN_NT_3x Label1 = "Windows NT 3" Case WIN_NT_4x Label1 = "Windows NT 4" Case WIN_2K Label1 = "Windows 2000" Case WIN_XP Label1 = "Windows XP" Case WIN_XP_HOME Label1 = "Windows XP Home Edition" Case WIN_2003 Label1 = "Windows 2003" End Select End Sub '---------------------------------------------------- ' GetOSVersion As WindowsVersion ' - Gibt die Betriebssystemversion zurück '---------------------------------------------------- Public Function GetOSVersion() As WindowsVersion Dim OsVersInfoEx As OSVERSIONINFOEX Dim OsVersInfo As OSVERSIONINFO If m_bAlreadyGot Then GetOSVersion = m_OsVersion Exit Function End If ' Zuerst nehmen wir nur die kleinere Struktur um sicherzugehen, ' dass Windows 95 und Konsorten auch damit klarkommen OsVersInfo.dwOSVersionInfoSize = Len(OsVersInfo) If GetVersionEx1(OsVersInfo) = 0 Then MsgBox "Das Betriebssystem konnte nicht korrekt erkannt werden:" & _ vbCrLf & "Fehler im API-Aufruf" m_OsVersion = WIN_OLD Exit Function End If With OsVersInfo Select Case .dwPlatformId Case VER_PLATFORM_WIN32s m_OsVersion = WIN_OLD Case VER_PLATFORM_WIN32_WINDOWS Select Case .dwMinorVersion Case 0 m_OsVersion = WIN_95 Case 10 m_OsVersion = WIN_98 Case 90 m_OsVersion = WIN_ME End Select Case VER_PLATFORM_WIN32_NT Select Case .dwMajorVersion Case 3 m_OsVersion = WIN_NT_3x Case 4 m_OsVersion = WIN_NT_4x Case 5 Select Case .dwMinorVersion Case 0 m_OsVersion = WIN_2K Case 1 ' Es handelt sich um Windows XP. Um zu erfahren, ob das verwendete ' Produkt eine Home-Edition ist, erfragen wir die Version erneut und ' empfangen dieses Mal die komplette Liste OsVersInfoEx.dwOSVersionInfoSize = _ Len(OsVersInfoEx) If GetVersionEx2(OsVersInfoEx) = 0 Then MsgBox "Das Betriebssystem konnte nicht " & _ "korrekt erkannt werden:" & _ vbCrLf & "Fehler im API-Aufruf" m_OsVersion = WIN_XP Exit Function End If If (OsVersInfoEx.wSuiteMask And VER_SUITE_PERSONAL) _ = VER_SUITE_PERSONAL Then m_OsVersion = WIN_XP_HOME Else m_OsVersion = WIN_XP End If Case 2 m_OsVersion = WIN_2003 End Select End Select End Select End With GetOSVersion = m_OsVersion m_bAlreadyGot = True End Function '---------- Ende Formular "Form1" alias Form1.frm ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 18 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Felix.S am 14.02.2009 um 15:10
Zu Cornflake:
Ich dacht, dass XP Version 6 und Vista und Win7 Version 7 ist.
Kommentar von J.Detlef Beyer am 14.06.2008 um 16:35
Hat schon jemand dieses schöne Listing um Vista erweitert?
mfg jdb
Kommentar von Milltach am 25.09.2007 um 07:15
Oh gott, also mit VB 2005 kann man das mit 3 zeilen machen und nicht wie hier 50 ^^... da sieht man wie toll .NET ist :>
Kommentar von Gregor am 07.07.2007 um 21:42
Hallo zusammen
Danke für diesen Tip, es läuft super unter Windows Vista 32
Kommentar von Timo Boehme am 15.01.2007 um 17:43
Hallo. Um Vista mit einzuschliessen müsste das so gehen (ungetestet):
Private Type SYSTEM_INFO
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOrfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
dwReserved As Long
End Type
Private Declare Function IsWow64Process Lib "kernel32" _
(ByVal hProcess As Long, _
ByRef Wow64Process As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Sub GetNativeSystemInfo Lib "kernel32" _
(lpSystemInfo As SYSTEM_INFO)
Case 6 'Vista
Dim Ret As Long
Call IsWow64Process(GetCurrentProcess, Ret)
If Ret <> 0 Then
m_OsVersion = WIN_VISTA_64
Dim SysInfo64 As SYSTEM_INFO
Call GetNativeSystemInfo(SysInfo64)
'MsgBox "Anzahl Prozessoren im 64-Bit System: " + CStr(SysInfo64.dwNumberOrfProcessors)
Else
m_OsVersion = WIN_VISTA_32
End If
Kommentar von NT24 am 10.12.2006 um 17:31
HALLO zusammne!
Hallo weiß irgendwer wie das Skript aussehen müsste wenn es Vista unterstützt??? würde das ziemlich dringend benötigen!
mfg
NT24
Kommentar von Kaspi am 22.08.2005 um 21:26
Super!
Habe das ganze in weniger als 2 Minuten unter Access 2003 angeschlossen.
Danggggi!
Kommentar von Cornflake am 21.03.2005 um 14:47
Oh sorry ja klar hat sich erledigt... XP
Kommentar von Cornflake am 21.03.2005 um 11:46
Welches Betriebssystem hat eigentlich die Nummer 7 ???
Kommentar von Hasso am 08.02.2005 um 01:35
Wäre es eventuell möglich, diesen Tip in ein sauberes Modul zu verpacken, sodaß man sich nicht glaeich den ganzen Rotz in sein Projekt irgendwo reinpfriemeln muß (was ohnehin nicht geht)?!
Kommentar von Frank am 13.12.2004 um 12:56
Ein kleiner Rechtschreibfehler:
oben steht bei Win2k: Windows 200
Da fehlt eine 0.
Aber sonst vielen dank! ;)
Kommentar von condor am 30.07.2003 um 23:29
hier die vollständige liste:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/osversioninfoex_str.asp
Kommentar von Goetz Reinecke am 07.08.2002 um 11:41
@Christoph:
0x34FFF8 AND 0xFFFF = 0xFFF8
= 0x34FfF8 0xFFF8
q.e.d.
Grüße
Götz
Kommentar von Christoph Ungersböck am 07.08.2002 um 08:13
If (.dwBuildNumber And &HFFFF&) &H7FFF Then
BuildNr = (.dwBuildNumber And &HFFFF&) - &H10000
Else
BuildNr = .dwBuildNumber And &HFFFF&
End If
bissal unsinnig!!!
eine zahl .AND. 0xFFFF ist wieder diese Zahl...
Kommentar von Sven Uhlig am 28.07.2002 um 16:20
Nette Tabelle. Aber es gibt anscheinend keinen Unterschied zwischen WinXp Home oder WinXp Professional?!
Kommentar von Jörg am 19.07.2002 um 09:57
Die Tabelle ist uach gut, etwas verrutscht *g*
Kommentar von Johannes M. Pfeiffer am 10.07.2002 um 14:56
Hier die vollständige Tabelle.
(Danke an Jörg)
MfG,
Johannes
Win95 Win98 Win98SE WinMe WinNT Win2k WinXP
PlatformId 1 1 1 1 2 2 2
MajorVersion 4 4 4 4 4 5 5
MinorVersion 0 10 10 90 0 0 1
BuildNumber 950 1998 2222 3000 1381 2195 2600
CSDVersion - - A - SP 5 - -
Kommentar von Renate Winken-Strecker am 02.05.2001 um 14:35
Habe den Tip in Access97 verwendet, hat sofort geklappt.
Danke!