|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||
| Visual Basic Helper Routines GetVersionEx: Windows Version Info (Wrapper Routines) |
||
| Posted: | Saturday August 14, 1999 | |
| Updated: | Monday December 26, 2011 | |
| Applies to: | VB4-32, VB5, VB6 | |
| Developed with: | VB6, Windows NT4, Windows 2000, Windows XP, Windows Vista | |
| OS restrictions: | None | |
| Author: | VBnet - Randy Birch | |
|
Related: |
GetVersionEx: Windows Version, Service Pack and Platform Info 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
a series of wrapper routines that can be called from anywhere in your app. Each simply returns
True when the matching operation system version or feature is found. Once you've
examined the code below you will see how easily you can create your own
derivations by modifying the appropriate values.
Notice that the illustration shows multiple True values. In addition to testing for specific operating systems or features, the wrappers below also provide tests for 'minimum' OS versions. Thus if you have a routine that only runs under NT4 or later, you can wrap that call in the IsWinNT4Plus() return value. If the system is NT4, Win 2000, XP home or Pro editions, Windows Vista, or Windows Server 2003 or 2008, the value will be True. The OSVERSIONINFO structure has evolved through Windows versions to create a second, larger structure: OSVERSIONINFOEX. The 'EX' flavour adds five new UDT members providing additional system information such as the service pack version, suite (windows type), and product type. While all versions of Windows can use the OSVERSIONINFO structure, the EX version is only supported under NT4 workstation SP6, and Windows 2000, XP, 2003 (.NET server), and Vista. To provide the additional data, the 'EX' structure is 8 bytes larger than the older structure. This poses a problem for the developer writing apps targeting both newer and legacy Windows versions who want to reuse routines as much as possible yet require the ability, under NT-based boxes, to query for additional information. Two solutions are available. The one shown here is the easiest to implement: each wrapper uses either the smallest required structure needed to obtain the data requested . Where the call is being made just to determine the OS version, the wrapper routine uses the OSVERSIONINFO structure as only parameters common to both this and the OSVERSIONINFOEX structure are required to successfully determine the OS version. When testing for features specific to systems requiring a minimum OS version, a call is first made to the low-grade wrapper to ensure the system supports the OSVERSIONINFOEX structure, which is subsequently used to determine the specific information extracted from the additional data this -EX structure provides. Each routine's local OSV is hard-coded to use the appropriate structure, facilitating referencing Len(osv) to set the required OSVSize parameter of the structure. To provide support for both structure sizes, this requires the GetVersionInfoEx API's lpVersionInformation parameter to be defined As Any. The alternative method (to be added to the site later) will contain a wrapper, called on load, which performs a series of progressive tests to identify the windows version, starting with Win95, then sets a constant equal to the supported OSV length. That value is used in all subsequent calls, with tests to ensure a Win9x test is not made on a WinNT box. Since setting the value essentially 'clips' the OSVERSIONINFOEX structure to simulate the OSVERSIONINFO structure needed under 9x, only one UDT is required and the value passed to GetVersionEx can be declared As OSVERSIONINFOEX. Which you ultimately choose to implement will be based on your determined needs. To summarize, the base version info returned by GetVersionEx for various Windows versions is:
Finally, note that MS recommends GetVersionEx be used appropriately. While it is perfectly safe to call GetVersion or GetVersionEx as often as needed, MS points out that identifying the current operating system is usually not the best way to determine whether a particular operating system *feature* is present, because the OS may have had new features added through a service pack or in a redistributable DLL. Their recommendation on Window versions prior to Vista is to test for the presence of the feature itself, rather than using GetVersionEx to determine the operating system platform or version number. For Vista (actually version 6 operating systems), a new API was introduced to retrieve what MS call Product Info - the ability to determine specific version 6 Windows versions. For Vista, this means identifying systems running Home, Home Premium, Business, Ultimate etc. Windows 2008 Server also supports GetProductInfo.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| BAS Module Code | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| None, though in due to the versatility of this code it would be prudent to develop a specific "WinVersion" BAS or CLS file to hold this set of routines. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Form Code | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| On a form, add a command button, a textbox
(Text1) and a label (Label1). Set the Index property of both the text box and
label to 0 to establish each as a control array. The load event
takes care of creating and positioning the required controls and resizing
the form (as coded the positioning works for for a
small-font system; some adjustment may be needed for non-standard display
attributes).
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. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'dwPlatformId
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
'os product type values
Private Const VER_NT_WORKSTATION As Long = &H1
Private Const VER_NT_DOMAIN_CONTROLLER As Long = &H2
Private Const VER_NT_SERVER As Long = &H3
'product types
Private Const VER_SERVER_NT As Long = &H80000000
Private Const VER_WORKSTATION_NT As Long = &H40000000
Private Const VER_SUITE_SMALLBUSINESS As Long = &H1
Private Const VER_SUITE_ENTERPRISE As Long = &H2
Private Const VER_SUITE_BACKOFFICE As Long = &H4
Private Const VER_SUITE_COMMUNICATIONS As Long = &H8
Private Const VER_SUITE_TERMINAL As Long = &H10
Private Const VER_SUITE_SMALLBUSINESS_RESTRICTED As Long = &H20
Private Const VER_SUITE_EMBEDDEDNT = &H40
Private Const VER_SUITE_DATACENTER As Long = &H80
Private Const VER_SUITE_SINGLEUSERTS As Long = &H100
Private Const VER_SUITE_PERSONAL As Long = &H200
Private Const VER_SUITE_BLADE As Long = &H400
Private Const OSV_LENGTH As Long = 148
Private Const OSVEX_LENGTH As Long = 156
Private Const SM_TABLETPC As Long = 86
Private Const SM_MEDIACENTER As Long = 87
Private Const SM_STARTER As Long = 88
Private Const SM_SERVERR2 As Long = 89
Private Const PROCESSOR_ARCHITECTURE_IA64 As Long = 6
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: string providing arbitrary additional information
End Type
Private Type OSVERSIONINFOEX
OSVSize As Long
dwVerMajor As Long
dwVerMinor As Long
dwBuildNumber As Long
PlatformID As Long
szCSDVersion As String * 128
wServicePackMajor As Integer
wServicePackMinor As Integer
wSuiteMask As Integer
wProductType As Byte
wReserved As Byte
End Type
Private Type SYSTEM_INFO
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
'defined As Any to support OSVERSIONINFO and OSVERSIONINFOEX
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
(lpVersionInformation As Any) As Long
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
Private Declare Sub GetSystemInfo Lib "kernel32" _
(lpSystemInfo As SYSTEM_INFO)
Private Declare Function GetProductInfo Lib "kernel32" _
(ByVal dwOSMajorVersion As Long, _
ByVal dwOSMinorVersion As Long, _
ByVal dwSpMajorVersion As Long, _
ByVal dwSpMinorVersion As Long, _
pdwReturnedProductType As Long) As Long
'GetProductInfo possible values
Private Const PRODUCT_UNDEFINED = &H0 'An unknown product
Private Const PRODUCT_ULTIMATE = &H1 'Ultimate Edition
Private Const PRODUCT_HOME_BASIC = &H2 'Home Basic Edition
Private Const PRODUCT_HOME_PREMIUM = &H3 'Home Premium Edition
Private Const PRODUCT_ENTERPRISE = &H4 'Enterprise Edition
Private Const PRODUCT_HOME_BASIC_N = &H5 'Home Basic Edition
Private Const PRODUCT_BUSINESS = &H6 'Business Edition
Private Const PRODUCT_STANDARD_SERVER = &H7 'Server Standard Edition (full installation)
Private Const PRODUCT_DATACENTER_SERVER = &H8 'Server Datacenter Edition (full installation)
Private Const PRODUCT_SMALLBUSINESS_SERVER = &H9 'Small Business Server
Private Const PRODUCT_ENTERPRISE_SERVER = &HA 'Server Enterprise Edition (full installation)
Private Const PRODUCT_STARTER = &HB 'Starter Edition
Private Const PRODUCT_DATACENTER_SERVER_CORE = &HC 'Server Datacenter Edition (core installation)
Private Const PRODUCT_STANDARD_SERVER_CORE = &HD 'Server Standard Edition (core installation)
Private Const PRODUCT_ENTERPRISE_SERVER_CORE = &HE 'Server Enterprise Edition (core installation)
Private Const PRODUCT_ENTERPRISE_SERVER_IA64 = &HF 'Server Enterprise Edition for Itanium-based Systems
Private Const PRODUCT_BUSINESS_N = &H10 'Business Edition
Private Const PRODUCT_WEB_SERVER = &H11 'Web Server Edition (full installation)
Private Const PRODUCT_CLUSTER_SERVER = &H12 'Cluster Server Edition
Private Const PRODUCT_HOME_SERVER = &H13 'Home Server Edition
Private Const PRODUCT_STORAGE_EXPRESS_SERVER = &H14 'Storage Server Express Edition
Private Const PRODUCT_STORAGE_STANDARD_SERVER = &H15 'Storage Server Standard Edition
Private Const PRODUCT_STORAGE_WORKGROUP_SERVER = &H16 'Storage Server Workgroup Edition
Private Const PRODUCT_STORAGE_ENTERPRISE_SERVER = &H17 'Storage Server Enterprise Edition
Private Const PRODUCT_SERVER_FOR_SMALLBUSINESS = &H18 'Server for Small Business Edition
Private Const PRODUCT_SMALLBUSINESS_SERVER_PREMIUM = &H19 'Small Business Server Premium Edition
Private Const PRODUCT_HOME_PREMIUM_N = &H1A 'Home Premium Edition
Private Const PRODUCT_ENTERPRISE_N = &H1B 'Enterprise Edition
Private Const PRODUCT_ULTIMATE_N = &H1C 'Ultimate Edition
Private Const PRODUCT_WEB_SERVER_CORE = &H1D 'Web Server Edition (core installation)
Private Const PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT = &H1E 'Windows Essential Business Server Management Server
Private Const PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY = &H1F 'Windows Essential Business Server Security Server
Private Const PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING = &H20 'Windows Essential Business Server Messaging Server
Private Const PRODUCT_STANDARD_SERVER_V = &H24 'Server Standard Edition without Hyper-V (full installation)
Private Const PRODUCT_DATACENTER_SERVER_V = &H25 'Server Datacenter Edition without Hyper-V (full installation)
Private Const PRODUCT_ENTERPRISE_SERVER_V = &H26 'Server Enterprise Edition without Hyper-V (full installation)
Private Const PRODUCT_DATACENTER_SERVER_CORE_V = &H27 'Server Datacenter Edition without Hyper-V (core installation)
Private Const PRODUCT_STANDARD_SERVER_CORE_V = &H28 'Server Standard Edition without Hyper-V (core installation)
Private Const PRODUCT_ENTERPRISE_SERVER_CORE_V = &H29 'Server Enterprise Edition without Hyper-V (core installation)
Private Sub Form_Load()
Dim cnt As Long
Dim nControls As Long
Dim nRows As Long
Dim nCols As Long
Dim nMaxCtrlsPerCol As Long
Dim hOffset As Single
Dim vOffset As Single
nControls = 42 '0-based
nRows = 2
nCols = 2
nMaxCtrlsPerCol = nControls \ 2
For cnt = 0 To nControls - 1
'control(0) already exists; don't try to load it!
If cnt > 0 Then
Load Label1(cnt)
Load Text1(cnt)
End If
'position and show
If cnt < nMaxCtrlsPerCol Then
hOffset = 1
vOffset = cnt
Else
hOffset = 2.4
vOffset = (cnt - nMaxCtrlsPerCol)
End If
With Text1(cnt)
.Move (3300 * hOffset), 200 + (vOffset * 300), 1300, 285
.Text = ""
.Visible = True
End With
With Label1(cnt)
.Alignment = vbRightJustify
.AutoSize = True
.Move Text1(cnt).Left - 200, (230 + (vOffset * 300)), 0, 195
.Visible = True
End With
Next
With Command1
.Move Text1(0).Left, _
Text1(nControls - 1).Top + _
Text1(nControls - 1).Height + 230, _
Text1(0).Width
.TabIndex = 0
.Caption = "What Version?"
End With
Me.Move Me.Left, Me.Top, _
(Text1(nControls - 1).Left + Text1(nControls - 1).Width + 1000), _
(Command1.Top + Command1.Height + 800)
End Sub
Private Sub Command1_Click()
Dim cnt As Long
Label1(0).Caption = "Is Windows 95 ?"
Label1(1).Caption = "Is Windows 95 OSR2 ?"
Label1(2).Caption = "Is Windows 98 ?"
Label1(3).Caption = "Is Windows ME ?"
Label1(4).Caption = "Is Windows NT4 ?"
Label1(5).Caption = "Is Windows NT4 Plus ?"
Label1(6).Caption = "Is Windows NT4 Server ?"
Label1(7).Caption = "Is Windows NT4 Workstation ?"
Label1(8).Caption = "Is Windows 2000 ?"
Label1(9).Caption = "Is Windows 2000 Plus ?"
Label1(10).Caption = "Is Windows 2000 Server ?"
Label1(11).Caption = "Is Windows 2000 Advanced Server ?"
Label1(12).Caption = "Is Windows 2000 Workstation ?"
Label1(13).Caption = "Is Windows XP ?"
Label1(14).Caption = "Is Windows XP Plus ?"
Label1(15).Caption = "Is Windows XP Home ?"
Label1(16).Caption = "Is Windows XP Pro ?"
Label1(17).Caption = "Is Windows XP Service Pack 2 ?"
Label1(18).Caption = "Is Windows XP Media Center Edition ?"
Label1(19).Caption = "Is Windows XP Starter Edition ?"
Label1(20).Caption = "Is Windows XP Tablet PC Edition ?"
Label1(21).Caption = "Is Windows XP Embedded ?"
Label1(22).Caption = "Is Windows XP 64-bit ?"
Label1(23).Caption = "Is Windows Vista ?"
Label1(24).Caption = "Is Windows Vista Plus ?"
Label1(25).Caption = "Is Windows Vista Home Basic ?"
Label1(26).Caption = "Is Windows Vista Home Premium ?"
Label1(27).Caption = "Is Windows Vista Business ?"
Label1(28).Caption = "Is Windows Vista Enterprise ?"
Label1(29).Caption = "Is Windows Vista Ultimate ?"
Label1(30).Caption = "Is Windows Vista Home Server ?"
Label1(31).Caption = "Is Windows Vista Service Pack 1 ?"
Label1(32).Caption = "Is Windows 2003 Server ?"
Label1(33).Caption = "Is Windows 2003 Server RC2 ?"
Label1(34).Caption = "Is Windows Longhorn Server ?"
Label1(35).Caption = "Is BackOffice Server ?"
Label1(36).Caption = "Is Blade Server ?"
Label1(37).Caption = "Is Domain Controller ?"
Label1(38).Caption = "Is Enterprise Server ?"
Label1(39).Caption = "Is Small Business Server ?"
Label1(40).Caption = "Is Small Business Restricted Server ?"
Label1(41).Caption = "Is Terminal Server ?"
Text1(0).Text = IsWin95()
Text1(1).Text = IsWin95OSR2()
Text1(2).Text = IsWin98()
Text1(3).Text = IsWinME()
Text1(4).Text = IsWinNT4()
Text1(5).Text = IsWinNT4Plus()
Text1(6).Text = IsWinNT4Server()
Text1(7).Text = IsWinNT4Workstation()
Text1(8).Text = IsWin2000()
Text1(9).Text = IsWin2000Plus()
Text1(10).Text = IsWin2000Server()
Text1(11).Text = IsWin2000AdvancedServer
Text1(12).Text = IsWin2000Workstation()
Text1(13).Text = IsWinXP()
Text1(14).Text = IsWinXPPlus()
Text1(15).Text = IsWinXPHomeEdition()
Text1(16).Text = IsWinXPProEdition()
Text1(17).Text = IsWinXPSP2()
Text1(18).Text = IsWinXPMediaCenter()
Text1(19).Text = IsWinXPStarter()
Text1(20).Text = IsWinXPTabletPc()
Text1(21).Text = IsWinXPEmbedded()
Text1(22).Text = IsWinXP64()
Text1(23).Text = IsWinVista()
Text1(24).Text = IsWinVistaPlus()
Text1(25).Text = IsWinVistaHomeBasic
Text1(26).Text = IsWinVistaHomePremium
Text1(27).Text = IsWinVistaBusiness
Text1(28).Text = IsWinVistaEnterprise
Text1(29).Text = IsWinVistaUltimate
Text1(30).Text = IsWinVistaHomeServer
Text1(31).Text = IsWinVistaSP1
Text1(32).Text = IsWin2003Server()
Text1(33).Text = IsWin2003ServerR2()
Text1(34).Text = IsWinLonghornServer()
Text1(35).Text = IsBackOfficeServer()
Text1(36).Text = IsBladeServer()
Text1(37).Text = IsDomainController()
Text1(38).Text = IsEnterpriseServer()
Text1(39).Text = IsSmallBusinessServer()
Text1(40).Text = IsSmallBusinessRestrictedServer()
Text1(41).Text = IsTerminalServer()
For cnt = Text1.LBound To Text1.UBound
If Text1(cnt).Text = "True" Then
Text1(cnt).BackColor = vbYellow
Label1(cnt).Font.Bold = True
End If
Next
End Sub
Private Function IsBackOfficeServer() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if Microsoft BackOffice components are installed
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWinNT4Plus() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsBackOfficeServer = (osv.wSuiteMask And VER_SUITE_BACKOFFICE)
End If
End If
End Function
Private Function IsBladeServer() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if Windows Server 2003 Web Edition is installed
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWin2003Server() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsBladeServer = (osv.wSuiteMask And VER_SUITE_BLADE)
End If
End If
End Function
Private Function IsDomainController() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if the server is a domain
'controller (Win 2000 or later), including
'under active directory
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWin2000Server() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsDomainController = (osv.wProductType = VER_NT_SERVER) And _
(osv.wProductType = VER_NT_DOMAIN_CONTROLLER)
End If
End If
End Function
Private Function IsEnterpriseServer() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if Windows NT 4.0 Enterprise Edition,
'Windows 2000 Advanced Server, or Windows Server 2003
'Enterprise Edition is installed.
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWinNT4Plus() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsEnterpriseServer = (osv.wProductType = VER_NT_SERVER) And _
(osv.wSuiteMask And VER_SUITE_ENTERPRISE)
End If
End If
End Function
Private Function IsSmallBusinessServer() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if Microsoft Small Business Server is installed
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWinNT4Plus() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsSmallBusinessServer = (osv.wSuiteMask And VER_SUITE_SMALLBUSINESS)
End If
End If
End Function
Private Function IsSmallBusinessRestrictedServer() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if Microsoft Small Business Server
'is installed with the restrictive client license
'in force
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWinNT4Plus() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsSmallBusinessRestrictedServer = (osv.wSuiteMask And VER_SUITE_SMALLBUSINESS_RESTRICTED)
End If
End If
End Function
Private Function IsTerminalServer() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if Terminal Services is installed
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWinNT4Plus() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsTerminalServer = (osv.wSuiteMask And VER_SUITE_TERMINAL)
End If
End If
End Function
Private Function IsWin95() As Boolean
'returns True if running Windows 95
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) And _
(osv.dwBuildNumber = 950)
End If
End Function
Private Function IsWin95OSR2() As Boolean
'returns True if running Windows 95 OSR2 (OEM Service Release 2)
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWin95OSR2 = (osv.PlatformID = VER_PLATFORM_WIN32_WINDOWS) And _
(osv.dwVerMajor = 4 And osv.dwVerMinor = 0) And _
(osv.dwBuildNumber = 1111)
End If
End Function
Private Function IsWin98() As Boolean
'returns True if running Windows 98
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 >= 1998)
End If
End Function
Private Function IsWinME() As Boolean
'returns True if running Windows ME
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) And _
(osv.dwBuildNumber >= 3000)
End If
End Function
Private Function IsWinNT4() As Boolean
'returns True if running Windows NT4
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinNT4 = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor = 4 And osv.dwVerMinor = 0) And _
(osv.dwBuildNumber >= 1381)
End If
End Function
Private Function IsWinNT4Plus() As Boolean
'returns True if running Windows NT4 or later
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinNT4Plus = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor >= 4)
End If
End Function
Private Function IsWinNT4Server() As Boolean
'returns True if running Windows NT4 Server
Dim osv As OSVERSIONINFOEX
If IsWinNT4() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinNT4Server = (osv.wProductType And VER_NT_SERVER)
End If
End If
End Function
Private Function IsWinNT4Workstation() As Boolean
'returns True if running Windows NT4 Workstation
Dim osv As OSVERSIONINFOEX
If IsWinNT4() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinNT4Workstation = (osv.wProductType And VER_NT_WORKSTATION)
End If
End If
End Function
Private Function IsWin2000() As Boolean
'returns True if running Windows 2000 (NT5)
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) And _
(osv.dwBuildNumber >= 2195)
End If
End Function
Private Function IsWin2000Plus() As Boolean
'returns True if running Windows 2000 or later
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWin2000Plus = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor => 5 And osv.dwVerMinor >= 0)
End If
End Function
Private Function IsWin2000AdvancedServer() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if Windows 2000 Advanced Server
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWin2000Plus() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWin2000AdvancedServer = ((osv.wProductType = VER_NT_SERVER) Or _
(osv.wProductType = VER_NT_DOMAIN_CONTROLLER)) And _
(osv.wSuiteMask And VER_SUITE_ENTERPRISE)
End If
End If
End Function
Private Function IsWin2000Server() As Boolean
Dim osv As OSVERSIONINFOEX
'Returns True if Windows 2000 Server
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWin2000() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWin2000Server = (osv.wProductType = VER_NT_SERVER)
End If
End If
End Function
Private Function IsWin2000Workstation() As Boolean
'returns True if running Windows NT4 Workstation
Dim osv As OSVERSIONINFOEX
If IsWin2000() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWin2000Workstation = (osv.wProductType And VER_NT_WORKSTATION)
End If
End If
End Function
Private Function IsWin2003Server() As Boolean
'returns True if running Windows 2003 (.NET) Server
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWin2003Server = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor = 5 And osv.dwVerMinor = 2) And _
(osv.dwBuildNumber = 3790)
End If
End Function
Private Function IsWin2003ServerR2() As Boolean
'returns True if running
'Windows 2003 (.NET) Server Release 2
If IsWin2003Server() Then
IsWin2003ServerR2 = GetSystemMetrics(SM_SERVERR2)
End If
End Function
Private Function IsWinXP() As Boolean
'returns True if running Windows XP
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) And _
(osv.dwBuildNumber >= 2600)
End If
End Function
Private Function IsWinXPSP2() As Boolean
'returns True if running Windows XP SP2 (Service Pack 2)
Dim osv As OSVERSIONINFOEX
If IsWinXP() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinXPSP2 = InStr(osv.szCSDVersion, "Service Pack 2") > 0
End If
End If
End Function
Private Function IsWinXPPlus() As Boolean
'returns True if running Windows XP or later
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinXPPlus = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
((osv.dwVerMajor >= 5 And osv.dwVerMinor >= 1) Or _
(osv.dwVerMajor >= 6 And osv.dwVerMinor >= 0))
End If
End Function
Private Function IsWinXPHomeEdition() As Boolean
'returns True if running Windows XP Home Edition
Dim osv As OSVERSIONINFOEX
If IsWinXP() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinXPHomeEdition = ((osv.wSuiteMask And VER_SUITE_PERSONAL) = VER_SUITE_PERSONAL)
End If
End If
End Function
Private Function IsWinXPProEdition() As Boolean
'returns True if running Windows XP Pro
Dim osv As OSVERSIONINFOEX
If IsWinXP() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinXPProEdition = Not ((osv.wSuiteMask And VER_SUITE_PERSONAL) = VER_SUITE_PERSONAL)
End If
End If
End Function
Private Function IsWinXPMediaCenter() As Boolean
'returns True if running Windows XP Media Centre
If IsWinXP() Then
IsWinXPMediaCenter = GetSystemMetrics(SM_MEDIACENTER)
End If
End Function
Private Function IsWinXPStarter() As Boolean
'returns True if running Windows XP Starter
If IsWinXP() Then
IsWinXPStarter = GetSystemMetrics(SM_STARTER)
End If
End Function
Private Function IsWinXPTabletPc() As Boolean
'returns True if running Windows XP Tablet Pc
If IsWinXP() Then
IsWinXPTabletPc = GetSystemMetrics(SM_TABLETPC)
End If
End Function
Private Function IsWinXPEmbedded() As Boolean
'Returns True if OS is Windows XP Embedded
Dim osv As OSVERSIONINFOEX
'OSVERSIONINFOEX supported on NT4 or
'later only, so a test is required
'before using
If IsWinXP() Then
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinXPEmbedded = (osv.wSuiteMask And VER_SUITE_EMBEDDEDNT)
End If
End If
End Function
Private Function IsWinXP64() As Boolean
'returns True if running Windows XP 64-bit
Dim osv As OSVERSIONINFOEX
Dim si As SYSTEM_INFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
GetSystemInfo si
'PLEASE SEE THE COMMENTS SECTION AT THE BOTTOM
'OF THIS PAGE IF YOU ARE RUNNING WINDOWS 64-BIT
'IsWinXP64 = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor = 5 And osv.dwVerMinor = 2) And _
(osv.wProductType <> VER_NT_WORKSTATION) And _
(si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_IA64)
End If
End Function
Private Function IsWinVista() As Boolean
'returns True if running Windows Vista
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinVista = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor = 6)
End If
End Function
Private Function IsWinVistaPlus() As Boolean
'returns True if running Windows Vista or later
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinVistaPlus = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor >= 6)
End If
End Function
Private Function IsWinVistaSP1() As Boolean
'returns True if running any Windows Vista version with SP1 applied
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinVistaSP1 = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor = 6) And _
InStr(osv.szCSDVersion, "Service Pack 1") > 0
End If
End Function
Private Function IsWinVistaBusiness() As Boolean
'returns True if running Windows Vista Business
Dim osv As OSVERSIONINFO
Dim dwProduct As Long
If IsWinVista() Then
osv.OSVSize = Len(osv)
GetVersionEx osv
If GetProductInfo(osv.dwVerMajor, osv.dwVerMinor, 0&, 0&, dwProduct) <> 0 Then
IsWinVistaBusiness = (dwProduct = PRODUCT_BUSINESS) Or _
(dwProduct = PRODUCT_BUSINESS_N)
End If 'GetProductInfo
End If 'IsWinVista
End Function
Private Function IsWinVistaUltimate() As Boolean
'returns True if running Windows Vista Ultimate
Dim osv As OSVERSIONINFO
Dim dwProduct As Long
If IsWinVista() Then
osv.OSVSize = Len(osv)
GetVersionEx osv
If GetProductInfo(osv.dwVerMajor, osv.dwVerMinor, 0&, 0&, dwProduct) <> 0 Then
IsWinVistaUltimate = (dwProduct = PRODUCT_ULTIMATE) Or _
(dwProduct = PRODUCT_ULTIMATE_N)
End If 'GetProductInfo
End If 'IsWinVista
End Function
Private Function IsWinVistaHomeServer() As Boolean
'returns True if running Windows Vista Home Server
Dim osv As OSVERSIONINFO
Dim dwProduct As Long
If IsWinVista() Then
osv.OSVSize = Len(osv)
GetVersionEx osv
If GetProductInfo(osv.dwVerMajor, osv.dwVerMinor, 0&, 0&, dwProduct) <> 0 Then
IsWinVistaHomeServer = (dwProduct = PRODUCT_HOME_SERVER)
End If 'GetProductInfo
End If 'IsWinVista
End Function
Private Function IsWinVistaHomeBasic() As Boolean
'returns True if running Windows Vista Home Basic
Dim osv As OSVERSIONINFO
Dim dwProduct As Long
If IsWinVista() Then
osv.OSVSize = Len(osv)
GetVersionEx osv
If GetProductInfo(osv.dwVerMajor, osv.dwVerMinor, 0&, 0&, dwProduct) <> 0 Then
IsWinVistaHomeBasic = (dwProduct = PRODUCT_HOME_BASIC) Or _
(dwProduct = PRODUCT_HOME_BASIC_N)
End If 'GetProductInfo
End If 'IsWinVista
End Function
Private Function IsWinVistaHomePremium() As Boolean
'returns True if running Windows Vista Home Premium
Dim osv As OSVERSIONINFO
Dim dwProduct As Long
If IsWinVista() Then
osv.OSVSize = Len(osv)
GetVersionEx osv
If GetProductInfo(osv.dwVerMajor, osv.dwVerMinor, 0&, 0&, dwProduct) <> 0 Then
IsWinVistaHomePremium = (dwProduct = PRODUCT_HOME_PREMIUM) Or _
(dwProduct = PRODUCT_HOME_PREMIUM_N)
End If 'GetProductInfo
End If 'IsWinVista
End Function
Private Function IsWinVistaEnterprise() As Boolean
'returns True if running Windows Vista Enterprise
Dim osv As OSVERSIONINFO
Dim dwProduct As Long
If IsWinVista() Then
osv.OSVSize = Len(osv)
GetVersionEx osv
If GetProductInfo(osv.dwVerMajor, osv.dwVerMinor, 0&, 0&, dwProduct) <> 0 Then
IsWinVistaEnterprise = (dwProduct = PRODUCT_ENTERPRISE) Or _
(dwProduct = PRODUCT_ENTERPRISE_N)
End If 'GetProductInfo
End If 'IsWinVista
End Function
Private Function IsWinLonghornServer() As Boolean
'returns True if running Windows Longhorn Server
Dim osv As OSVERSIONINFOEX
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
IsWinLonghornServer = (osv.PlatformID = VER_PLATFORM_WIN32_NT) And _
(osv.dwVerMajor = 6 And osv.dwVerMinor = 0) And _
(osv.wProductType <> VER_NT_WORKSTATION)
End If
End Function
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Comments | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Running the project will populate the
appropriate text
boxes with True, indicating the current platform tests.
ELICITING HELP FROM
WINDOWS 64-BIT USERS
In
my tests her on Win32, none of these options causes the call to
GetSystemInfo to fail. Therefore it is possible that
any or all of these three variations will provide the desired data under 64-bit Windows.
I would like to ask those of you who are running XP 64-bit to
create the following demo for me and email me (using the Comments link
in the navigation bar) with the method(s) that work under Win64.
'API redefined As Any to accommodate SYSTEM_INFO variations below
Private Declare Sub GetSystemInfo Lib "kernel32" _
(lpSystemInfo As Any)
'A) testing the high and low words comprising dwOemID when Long
Private Type SYSTEM_INFO_A
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
'B) redefining the structure to split the Long into two Integers
Private Type SYSTEM_INFO_B
wProcessorArchitecture As Integer
wReserved As Integer
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
'C) utilizing a second Integer structure
Private Type OEM_UNION
wProcessorArchitecture As Integer
wReserved As Integer
End Type
Private Type SYSTEM_INFO_C
dwOemID As OEM_UNION
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
' TESTING CODE
Private Sub Command1_Click()
dim siA as SYSTEM_INFO_A
dim siB as SYSTEM_INFO_B
dim siC as SYSTEM_INFO_C
GetSystemInfo siA
debug.print loword(siA.dwOemId), hiword(siA.dwOemId)
GetSystemInfo siB
debug.print siB.wProcessorArchitecture, siB.wReserved
GetSystemInfo siC
debug.print siC.dwOemID.wProcessorArchitecture, siC.dwOemID.wReserved
End Sub
'SUPPORT ROUTINES FOR METHOD A
Private Function HiWord(wParam As Long) As Integer
If wParam And &H80000000 Then
HiWord = (wParam \ 65535) - 1
Else
HiWord = wParam \ 65535
End If
End Function
Private Function LoWord(wParam As Long) As Integer
If wParam And &H8000& Then
LoWord = &H8000& Or (wParam And &H7FFF&)
Else
LoWord = wParam And &HFFFF&
End If
End Function
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |