Я хочу определить любые версии Windows от 95 до Win 7.
Я также хотел бы показать, является ли ОС 32-разрядной или 64-разрядной.
Что это; это так просто.:) Какой код я мог использовать для этого в приложении VB 6?
Я хочу определить любые версии Windows от 95 до Win 7.
Я также хотел бы показать, является ли ОС 32-разрядной или 64-разрядной.
Что это; это так просто.:) Какой код я мог использовать для этого в приложении VB 6?
Обновление: Для кода, который правильно определяет Windows 8.1 и Windows 10, см. этот ответ.
Код ниже по-прежнему отлично подходит для старых версий Windows, но он будет сообщать о чем-либо более новом, чем Windows 8, как о Windows 8.
Код проверки "битности", показанный внизу (чтобы проверить, работает ли ОС 32-разрядной или 64-разрядной, даже в Windows 10.
Следующий код вернет строковое значение, указывающее текущую версию Windows. В основном, все, что он делает, это получить номера версий системы из Windows с помощью функции GetVersionEx
API, а затем сопоставить их с известными версиями 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
structure вместо. Я просто написал этот код на С++, и документация на удивление легко следовать.
Определение того, является ли ОС хоста 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
Там также Задачи WMI для операционных систем.
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.Version
Next
Вы можете сделать что-то похожее на операторы case, предоставленные Cody Gray выше, чтобы проанализировать значение Version
или проанализировать значение обычного текста Caption
, которое имеет списки, такие как Microsoft(R) Windows(R) Server 2003, Standard Edition
и Microsoft Windows 7 Professional
.
Вы можете попробовать использовать Microsoft элемент управления Sysinfo, который поставляется вместе с VB6 и проверить свойства OSPlatform, OSBuild и OSVersion, чтобы они соответствовали правильному Версия ОС#
Принятый ответ работал на мое приложение, пока я не попробовал его в Windows 10. Даже после обновления кода для номера версии как указано здесь сообщила о неправильной версии Windows. Оказывается, это происходит потому, что:
Приложения, которые не отображаются для Windows 8.1 или Windows 10, вернут значение версии ОС Windows 8 (6.2). Когда приложение проявляется для данной версии операционной системы, GetVersionEx всегда будет возвращать версию, в которой приложение проявляется в будущих выпусках. Чтобы продемонстрировать свои приложения для Windows 8.1 или Windows 10, обратитесь к Таргетинг на приложение для Windows.
Итак, чтобы отобразить правильную версию Windows, это означает добавление раздела в манифест приложения:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
И тогда API GetVersionInfo работает так, как ожидалось. Я считаю, что этот манифест был новым, как в Windows 7.
Однако очень важно предостережение в том, что вы действительно должны были протестировать свое приложение на каждой версии операционной системы, которое вы перечислили как совместимое с. Эти параметры влияют на некоторые функции Windows, а не только на информацию о версии Windows.
Вот очень простой метод, который я использую для определения 32-разрядной 64-разрядной операционной системы:
OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)
В 64-разрядной Windows ОС задает переменную среды "PROGRAMFILES (X86)", но она не относится к 32-разрядным системам. Это еще не подвело меня...
А, нашел! Я лично не использую этот класс, потому что для моих нужд это излишне, но это определенно самый тщательный пример версии OpSys, с которым я столкнулся. Кредит для этого идет к Кеннету Айвсу.
* Я думаю, StackOverflow не любит огромные блоки кода, поэтому класс (clsOperSystem.cls) находится в KiCrypt Demo, отличная компиляция алгоритмов хеширования и шифрования.
РАБОТА НА WINDOWS 10 VB6 - не работает в режиме отладки - работает только во время выполнения
Private Declare Function RtlGetVersion Lib "ntdll" (ByRef lpVersionInformation As RTL_OSVERSIONINFOEX) As Long
Private Type RTL_OSVERSIONINFOEX
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Вызов
Dim lpVersionInformation As RTL_OSVERSIONINFOEX
lpVersionInformation.dwOSVersionInfoSize = Len(lpVersionInformation)
RtlGetVersion(lpVersionInformation)