Обновление: Код, который правильно определяет Windows 8.1 и Windows 10, см. в этом ответе .
Приведенный ниже код отлично работает для более старых версий Windows, но он сообщит о чем-то более новом, чем Windows 8, как о Windows 8.
Код проверки «битности» показан внизу (чтобы увидеть, работает ли 32-битная или 64-битная ОС, даже в Windows 10.
Следующий код вернет строковое значение, указывающее текущую версию Windows. По сути, все, что он делает - это получает номера версий системы из Windows с помощью функции API GetVersionEx
, а затем сопоставляет их с известными версиями Windows.
(Обратите внимание, что некоторые вещи обнаруживаются не полностью. Например, 64-разрядная версия Windows XP, скорее всего, будет указана как Server 2003. Код, определяющий, например, работает ли пользователь Windows Vista или Server 2008 также не было написано. Но вы можете взять это и настроить по желанию.)
Option Explicit
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
(lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
OSVSize As Long
dwVerMajor As Long
dwVerMinor As Long
dwBuildNumber As Long
PlatformID As Long
szCSDVersion As String * 128
End Type
Private Const VER_PLATFORM_WIN32s = 0
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2
' Returns the version of Windows that the user is running
Public 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 If
End Function
Кроме того, если вам не нужно ориентироваться на самые ранние версии Windows, вы можете получить больше информации, передав вместо этого структуру OSVERSIONINFOEX
. Я только что написал этот код на C ++, и за документацией на удивление легко следовать.
Определить, является ли ОС хоста 32-битной или 64-битной из исполняемого файла VB 6, немного сложнее. Причина в том, что VB 6 не может компилировать 64-битные приложения. Все, что вы пишете в VB 6, будет работать как 32-битное приложение. И 32-разрядные приложения работают в 64-разрядных версиях Windows в подсистеме Windows-on-Windows (WOW64). Они всегда будут сообщать о текущей версии Windows как 32-разрядной, потому что это то, что они видят.
Мы можем обойти это, изначально предполагая, что хост-ОС является 32-битной, и пытаясь доказать это неправильно. Вот пример кода:
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 Long
Private Declare Function IsWow64Process Lib "kernel32" _
(ByVal hProc As Long, ByRef bWow64Process As Boolean) As Long
Public 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 = is64Bit
End Function