Attribute VB_Name = "mOSVersion"
'
'PROJECT:       <Component Module>
'COMPONENT:     Module: Windows Version
'
'------------------------------------------------------------------------------------
'Usage: Returns Windows Version
'
'       ==============
'       PUBLIC METHODS
'       ==============
'
'WinVersionS: Returns Version name as String
'             Call as needed
'
'WinVersionI: Returns Version ID as Integer or enumWindowsVersions
'             Call as needed
'------------------------------------------------------------------------------------
'

Option Explicit

'declare external procedures
    Private Declare Function GetVersionEx Lib "kernel32" _
                            Alias "GetVersionExA" _
                            (lpVersionInformation As OSVERSIONINFO) _
                            As Long

'declare types
    Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion      As Long
        dwMinorVersion      As Long
        dwBuildNumber       As Long
        dwPlatformId        As Long
        szCSDVersion        As String * 128
    End Type
    
'declare enums (used by `WinVersionI` only)
    Public Enum enumWindowsVersion
        osUnknown = 0
        osWindows3x = 1
        osWindows95 = 2
        osWindows95b = 3
        osWindows98 = 4
        osWindows98se = 5
        osWindowsME = 6
        osWindowsNT = 7
        osWindows2000 = 8
        osWindowsXP = 9
    End Enum

'declare constants
    Private Const WIN_3X = 0
    Private Const WIN_9X = 1
    Private Const WIN_NTX = 2

Public Function WinVersionS() As String
    'init
    Dim vOSV            As OSVERSIONINFO
    Dim rv              As Long
    
    'init values
    WinVersionS = "Unknown"
    vOSV.dwOSVersionInfoSize = Len(vOSV)
    
    'get version info
    rv = GetVersionEx(vOSV)
    
    If Not rv = 0 Then
        With vOSV
            Select Case .dwPlatformId
                Case WIN_3X
                    WinVersionS = "Windows 3.x"
                    
                Case WIN_9X
                    Select Case .dwMinorVersion
                        Case 0
'                            LoWord (.dwBuildNumber)
                            If LoWord(.dwBuildNumber) = 950 Then
                                WinVersionS = "Windows 95"
                            Else
                                WinVersionS = "Windows 95B"
                            End If
                        Case 10
                            If LoWord(.dwBuildNumber) = 1998 Then
                                WinVersionS = "Windows 98"
                            Else
                                WinVersionS = "Windows 98se"
                            End If
                        Case 90
                            WinVersionS = "Windows ME"
                    End Select
                    
                Case WIN_NTX
                    Select Case True
                        Case (.dwMajorVersion < 5)
                            WinVersionS = "Windows NT"
                        Case (.dwMajorVersion = 5)
                            Select Case .dwMinorVersion
                                Case 0
                                    WinVersionS = "Windows 2000"
                                Case 1
                                    WinVersionS = "Windows XP"
                            End Select
                    End Select
            End Select
        End With
    End If
End Function

Public Function WinVersionI() As enumWindowsVersion
    'init
    Dim vOSV            As OSVERSIONINFO
    Dim rv              As Long
    
    'init values
    WinVersionI = osUnknown
    vOSV.dwOSVersionInfoSize = Len(vOSV)
    
    'get version info
    rv = GetVersionEx(vOSV)
    
    If Not rv = 0 Then
        With vOSV
            Select Case .dwPlatformId
                Case WIN_3X
                    WinVersionI = osWindows3x
                    
                Case WIN_9X
                    Select Case .dwMinorVersion
                        Case 0
                            If LoWord(.dwBuildNumber) = 950 Then
                                WinVersionI = osWindows95
                            Else
                                WinVersionI = osWindows95b
                            End If
                        Case 10
                            If LoWord(.dwBuildNumber) = 1998 Then
                                WinVersionI = osWindows98
                            Else
                                WinVersionI = osWindows98se
                            End If
                        Case 90
                            WinVersionI = osWindowsME
                    End Select
                    
                Case WIN_NTX
                    Select Case True
                        Case (.dwMajorVersion < 5)
                            WinVersionI = osWindowsNT
                        Case (.dwMajorVersion = 5)
                            Select Case .dwMinorVersion
                                Case 0
                                    WinVersionI = osWindows2000
                                Case 1
                                    WinVersionI = osWindowsXP
                            End Select
                    End Select
            End Select
        End With
    End If
End Function

