Visual Basic System Services
GetVersionEx: Windows Version, Service Pack and Platform Info
     
Posted:   Monday May 24, 1999
Updated:   Monday December 26, 2011
     
Applies to:   VB4-32, VB5, VB6
Developed with:   VB6, Windows NT4
OS restrictions:   None
Author:   VBnet - Randy Birch
     

Related:  

GetVersionEx: Windows Version Info (Wrapper Routines)
GetFileVersionInfo: Handy Routines for Identifying Shell32 Versions
GetSystemInfo: System Processor Information

NetServerGetInfo: Configuration Info for Domain/Workgroup Servers and Machines
     
 Prerequisites
None.

This page provides several wrapper routines for obtaining general Windows operation system information, all using a single call to the GetVersionEx API.

One of the two main routines populates a developer-defined type with the OS information allowing creation of the information shown in the illustration's first six text boxes. The other routine returns just the version number in a string (as shown in the "Together" text box).

A small set of wrapper routines for basic OS identification are also presented; the page at GetVersionEx: Windows Version Info (Wrapper Routines) contains a much more exhaustive set of IsWinXXX functions that including additional tests returning information such as whether the OS is Terminal Server, Small Business Server, a domain controller, BackOffice server, etc.

MS recommends that the use of GetVersionEx be used in appropriate situations. The API is perfectly safe to call as often as needed, but as MS points out identifying the current operating system is usually not the best way to determine whether a particular operating system *feature* is present. Their recommendation is to test for the presence of the feature itself.

Revision History

Aug 21.2004     Updated IsWin98()
   

 BAS Module Code
None.

 Form Code
On a form, add a command button, a textbox as Text1(0) creating a control array, and a single label (Label1(0) as a control array). Add the following code to the form:

Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
'               applications, but you may not reproduce 
'               or publish this code on any web site,
'               online service, or distribute as source 
'               on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Const VER_PLATFORM_WIN32s = 0
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2

'windows-defined type OSVERSIONINFO
Private Type OSVERSIONINFO
  OSVSize         As Long         'size, in bytes, of this data structure
  dwVerMajor      As Long         'ie NT 3.51, dwVerMajor = 3; NT 4.0, dwVerMajor = 4.
  dwVerMinor      As Long         'ie NT 3.51, dwVerMinor = 51; NT 4.0, dwVerMinor= 0.
  dwBuildNumber   As Long         'NT: build number of the OS
                                  'Win9x: build number of the OS in low-order word.
                                  '       High-order word contains major & minor ver nos.
  PlatformID      As Long         'Identifies the operating system platform.
  szCSDVersion    As String * 128 'NT: string, such as "Service Pack 3"
                                  'Win9x: 'arbitrary additional information'
End Type


'my type for holding the retrieved info
Private Type RGB_WINVER
  PlatformID      As Long
  VersionName     As String
  VersionNo       As String
  ServicePack     As String
  BuildNo         As String
End Type

Private Declare Function GetVersionEx Lib "kernel32" _
   Alias "GetVersionExA" _
  (lpVersionInformation As OSVERSIONINFO) As Long




Private Sub Form_Load()

  Dim cnt As Long
  Dim TotalRequired As Long
  
  Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2  

 'the array is 0-based, so the first control is
 'index 0, and the last is TotalRequired -1
  TotalRequired = 13 
  For cnt = 0 To TotalRequired - 1
   
     'since Text1(0) already exists, we don't load it
      If cnt > 0 Then
         Load Label1(cnt)
         Load Text1(cnt)
      End If
      
     'position the newly-created control
      Label1(cnt).Move 120, 230 + (cnt * 300)
      Text1(cnt).Move 1600, 200 + (cnt * 300), 3900, 285
      
     'and show
      Label1(cnt).Visible = True
      Text1(cnt).Visible = True
      
   Next
   
   With Label1
      .Item(0).Caption = "Windows version"
      .Item(1).Caption = "Version number"
      .Item(2).Caption = "Build number"
      .Item(3).Caption = "Service Pack/misc"
      .Item(4).Caption = "Platform identifier"
      .Item(5).Caption = "Together"
      .Item(6).Caption = "IsWin95 returns"
      .Item(7).Caption = "IsWin98 returns"
      .Item(8).Caption = "IsWinME returns"
      .Item(9).Caption = "IsWinNT4 returns"
      .Item(10).Caption = "IsWin2000 returns"
      .Item(11).Caption = "IsWinXP returns"
      .Item(12).Caption = "GetWinVer returns"
   End With
   
End Sub


Private Sub Command1_Click()

   Dim win As RGB_WINVER
     
   Call GetWinVersion(win)

   Text1(0).Text = win.VersionName
   Text1(1).Text = win.VersionNo
   Text1(2).Text = win.BuildNo
   Text1(3).Text = win.ServicePack
   Text1(4).Text = win.PlatformID
   
  'as a version string
   Text1(5).Text = win.VersionName & " " & _
                   win.VersionNo & " build " & _
                   win.BuildNo & " (" & _
                   win.ServicePack & ")"
              
   Text1(6).Text = IsWin95()
   Text1(7).Text = IsWin98()
   Text1(8).Text = IsWinME()
   Text1(9).Text = IsWinNT4()
   Text1(10).Text = IsWin2000()
   Text1(11).Text = IsWinXP()
   Text1(12).Text = GetWinVer()
      
End Sub


Private Function GetWinVersion(win As RGB_WINVER) As String

'returns a structure (RGB_WINVER)
'filled with OS information

  #If Win32 Then
  
   Dim osv As OSVERSIONINFO
   Dim pos As Integer
   Dim sVer As String
   Dim sBuild As String
   
   osv.OSVSize = Len(osv)
   
   If GetVersionEx(osv) = 1 Then
   
     'PlatformId contains a value representing the OS
      win.PlatformID = osv.PlatformID
     
      Select Case osv.PlatformID
         Case VER_PLATFORM_WIN32s:   win.VersionName = "Win32s"
         Case VER_PLATFORM_WIN32_NT: win.VersionName = "Windows NT"
         
         Select Case osv.dwVerMajor
            Case 4:  win.VersionName = "Windows NT"
            Case 5:
            Select Case osv.dwVerMinor
               Case 0:  win.VersionName = "Windows 2000"
               Case 1:  win.VersionName = "Windows XP"
            End Select
        End Select
                  
         Case VER_PLATFORM_WIN32_WINDOWS:
         
          'The dwVerMinor bit tells if its 95 or 98.
            Select Case osv.dwVerMinor
               Case 0:    win.VersionName = "Windows 95"
               Case 90:   win.VersionName = "Windows ME"
               Case Else: win.VersionName = "Windows 98"
            End Select
         
      End Select
   
   
     'Get the version number
      win.VersionNo = osv.dwVerMajor & "." & osv.dwVerMinor
  
     'Get the build
      win.BuildNo = (osv.dwBuildNumber And &HFFFF&)
       
     'Any additional info. In Win9x, this can be
     '"any arbitrary string" provided by the
     'manufacturer. In NT, this is the service pack.
      pos = InStr(osv.szCSDVersion, Chr$(0))
      If pos Then
         win.ServicePack = Left$(osv.szCSDVersion, pos - 1)
      End If

   End If
   
  #Else
  
    'can only return that this does not
    'support the 32 bit call, so must be Win3x
     win.VersionName = "Windows 3.x"
  #End If
  
End Function


Private Function IsWin95() As Boolean

'returns True if running Win95

   #If Win32 Then
  
      Dim osv As OSVERSIONINFO
   
      osv.OSVSize = Len(osv)
   
      If GetVersionEx(osv) = 1 Then
   
         IsWin95 = (osv.PlatformID = VER_PLATFORM_WIN32_WINDOWS) And _
                   (osv.dwVerMajor = 4 And osv.dwVerMinor = 0)
                            
      End If

   #End If

End Function


Private Function IsWin98() As Boolean

  'returns True if running Win98
   Dim osv As OSVERSIONINFO

   osv.OSVSize = Len(osv)

   If GetVersionEx(osv) = 1 Then
   
      IsWin98 = (osv.PlatformID = VER_PLATFORM_WIN32_WINDOWS) And _
                (osv.dwVerMajor = 4 And osv.dwVerMinor = 10) And _
                (osv.dwBuildNumber >= 2222)
                
   End If

End Function


Private Function IsWinME() As Boolean

'returns True if running Windows ME

   #If Win32 Then
  
      Dim osv As OSVERSIONINFO
   
      osv.OSVSize = Len(osv)
   
      If GetVersionEx(osv) = 1 Then
   
         IsWinME = (osv.PlatformID = VER_PLATFORM_WIN32_WINDOWS) And _
                   (osv.dwVerMajor = 4 And osv.dwVerMinor = 90)
                            
      End If

   #End If

End Function


Private Function IsWinNT4() As Boolean

'returns True if running WinNT4

   #If Win32 Then
  
      Dim osv As OSVERSIONINFO
   
      osv.OSVSize = Len(osv)
   
      If GetVersionEx(osv) = 1 Then
   
        'PlatformId contains a value representing the OS.
        'If VER_PLATFORM_WIN32_NT and dwVerMajor is 4, return true
         IsWinNT4 = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
                    (osv.dwVerMajor = 4)
      End If

   #End If

End Function



Private Function IsWin2000() As Boolean

'returns True if running Windows 2000 (NT5)

   #If Win32 Then
  
      Dim osv As OSVERSIONINFO
   
      osv.OSVSize = Len(osv)
   
      If GetVersionEx(osv) = 1 Then
         IsWin2000 = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
                     (osv.dwVerMajor = 5 And osv.dwVerMinor = 0)
      End If

   #End If

End Function


Private Function IsWinXP() As Boolean

'returns True if running WinXP (NT5.1)

   #If Win32 Then
  
      Dim osv As OSVERSIONINFO
   
      osv.OSVSize = Len(osv)
   
      If GetVersionEx(osv) = 1 Then

         IsWinXP = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
                   (osv.dwVerMajor = 5 And osv.dwVerMinor = 1)
      End If

   #End If

End Function


Private Function GetWinVer() As String

'returns a string representing the version,
'ie "95", "98", "NT4", "WinXP"  
   Dim osv As OSVERSIONINFO
   Dim r As Long
   Dim pos As Integer
   Dim sVer As String
   Dim sBuild As String
   
   osv.OSVSize = Len(osv)
   
   If GetVersionEx(osv) = 1 Then
   
     'PlatformId contains a value representing the OS
      Select Case osv.PlatformID
         Case VER_PLATFORM_WIN32s: GetWinVer = "32s"
         Case VER_PLATFORM_WIN32_NT:
                   
           'dwVerMajor = NT version.
           'dwVerMinor = minor version
            Select Case osv.dwVerMajor
               Case 3:
               
                  Select Case osv.dwVerMinor
                     Case 0:  GetWinVer = "NT3"
                     Case 1:  GetWinVer = "NT3.1"
                     Case 5:  GetWinVer = "NT3.5"
                     Case 51: GetWinVer = "NT3.51"
                  End Select
            
               Case 4: GetWinVer = "NT 4"
               Case 5:
               
                  Select Case osv.dwVerMinor
                     Case 0:  GetWinVer = "Win2000"
                     Case 1:  GetWinVer = "WinXP"
                  End Select
            
            End Select
         
         Case VER_PLATFORM_WIN32_WINDOWS:
         
           'dwVerMinor bit tells if its 95 or 98.
            Select Case osv.dwVerMinor
               Case 0:    GetWinVer = "95"
               Case 90:   GetWinVer = "ME"               
               Case Else: GetWinVer = "98"
            End Select
         
      End Select
         
   End If

End Function
 Comments
Running the project will populate the fields with the info returned by the operating system. IsWinNT4 / IsWin2000 / IsWin95 / IsWin98 / IsWinME will return True or False as expected. GetVersionEx: Windows Version Info (Wrapper Routines) has additional wrappers providing even more specific information (where supported) such as major and minor version numbers, a build number, a platform identifier (server, workstation etc), and information about product suites (business, enterprise, terminal etc) and the latest Service Pack installed on the system.

 
 

PayPal Link
Make payments with PayPal - it's fast, free and secure!

 
 
 
 

Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved.
Terms of Use  |  Your Privacy

 

Hit Counter