How can I determine the Windows version from a VB 6 app? How can I determine the Windows version from a VB 6 app? windows windows

How can I determine the Windows version from a VB 6 app?


Update: For code that correctly detects Windows 8.1 and Windows 10, see this answer.

The code below still works fine for older versions of Windows, but it will report anything newer than Windows 8 as being Windows 8.

The "bitness" testing code shown at the bottom (to see if the OS is 32-bit or 64-bit still works, even on Windows 10.

The following code will return a string value indicating the current version of Windows. Basically, all it's doing is getting the system version numbers from Windows using the GetVersionEx API function, and then matching those up to the known versions of Windows.

(Note that some things are not detected perfectly. For example, a 64-bit version of Windows XP would likely be reported as Server 2003. Code to determine whether the user is running Windows Vista or Server 2008, for example, has also not been written. But you can take this and tweak it as desired.)

Option ExplicitPrivate Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _    (lpVersionInformation As OSVERSIONINFO) As LongPrivate Type OSVERSIONINFO  OSVSize         As Long  dwVerMajor      As Long  dwVerMinor      As Long  dwBuildNumber   As Long  PlatformID      As Long  szCSDVersion    As String * 128End TypePrivate Const VER_PLATFORM_WIN32s = 0Private Const VER_PLATFORM_WIN32_WINDOWS = 1Private Const VER_PLATFORM_WIN32_NT = 2' Returns the version of Windows that the user is runningPublic Function GetWindowsVersion() As String    Dim osv As OSVERSIONINFO    osv.OSVSize = Len(osv)    If GetVersionEx(osv) = 1 Then        Select Case osv.PlatformID            Case VER_PLATFORM_WIN32s                GetWindowsVersion = "Win32s on Windows 3.1"            Case VER_PLATFORM_WIN32_NT                GetWindowsVersion = "Windows NT"                                Select Case osv.dwVerMajor                    Case 3                        GetWindowsVersion = "Windows NT 3.5"                    Case 4                        GetWindowsVersion = "Windows NT 4.0"                    Case 5                        Select Case osv.dwVerMinor                            Case 0                                GetWindowsVersion = "Windows 2000"                            Case 1                                GetWindowsVersion = "Windows XP"                            Case 2                                GetWindowsVersion = "Windows Server 2003"                        End Select                    Case 6                        Select Case osv.dwVerMinor                            Case 0                                GetWindowsVersion = "Windows Vista/Server 2008"                            Case 1                                GetWindowsVersion = "Windows 7/Server 2008 R2"                            Case 2                                GetWindowsVersion = "Windows 8/Server 2012"                            Case 3                                GetWindowsVersion = "Windows 8.1/Server 2012 R2"                        End Select                End Select                    Case VER_PLATFORM_WIN32_WINDOWS:                Select Case osv.dwVerMinor                    Case 0                        GetWindowsVersion = "Windows 95"                    Case 90                        GetWindowsVersion = "Windows Me"                    Case Else                        GetWindowsVersion = "Windows 98"                End Select        End Select    Else        GetWindowsVersion = "Unable to identify your version of Windows."    End IfEnd Function

Additionally, if you don't need to target the earliest versions of Windows, you can get more information by passing the OSVERSIONINFOEX structure instead. I just wrote that code in C++, and the documentation is surprisingly easy to follow.


Determining if the host OS is 32-bit or 64-bit from a VB 6 executable is a little trickier. The reason is because VB 6 can't compile 64-bit applications. Everything you write in VB 6 will run as a 32-bit application. And 32-bit applications run on 64-bit versions of Windows in the Windows-on-Windows (WOW64) subsystem. They will always report the current version of Windows as 32-bit, because that's what they see.

We can work around this by initially assuming that the host OS is 32-bit, and attempting to prove this wrong. Here's some sample code:

Private Declare Function GetProcAddress Lib "kernel32" _    (ByVal hModule As Long, ByVal lpProcName As String) As Long    Private Declare Function GetModuleHandle Lib "kernel32" _    Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long    Private Declare Function GetCurrentProcess Lib "kernel32" () As LongPrivate Declare Function IsWow64Process Lib "kernel32" _    (ByVal hProc As Long, ByRef bWow64Process As Boolean) As LongPublic Function IsHost64Bit() As Boolean    Dim handle As Long    Dim is64Bit As Boolean    ' Assume initially that this is not a WOW64 process    is64Bit = False    ' Then try to prove that wrong by attempting to load the    ' IsWow64Process function dynamically    handle = GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process")    ' The function exists, so call it    If handle <> 0 Then        IsWow64Process GetCurrentProcess(), is64Bit    End If    ' Return the value    IsHost64Bit = is64BitEnd Function


There's also the WMI Tasks for Operating Systems.

strComputer = "."Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")For Each objOperatingSystem in colOperatingSystems    Wscript.Echo objOperatingSystem.Caption & "  " & objOperatingSystem.VersionNext

You can do something similar to the case statements provided by Cody Gray above to parse the Version value, or parse the plain text Caption value, which has listings like Microsoft(R) Windows(R) Server 2003, Standard Edition and Microsoft Windows 7 Professional.


You could try using the Microsoft Sysinfo control that comes with VB6 and check for OSPlatform, OSBuild and OSVersion propertys to match with the proper OS Version #