Как определить версию Windows из приложения VB 6? - PullRequest
18 голосов
/ 29 января 2011

Я хочу обнаружить любые версии Windows от 95 до Win 7.

Я также хотел бы отобразить, является ли ОС 32-битной или 64-битной.

Вот и все;это так просто.:) Какой код можно использовать для этого из приложения VB 6?

Ответы [ 7 ]

27 голосов
/ 30 января 2011

Обновление: Код, который правильно определяет 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
4 голосов
/ 29 октября 2013

Также есть задачи 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 Grey выше, чтобы проанализировать значение Version или проанализировать значение Caption в обычном тексте, которое имеет списки типа Microsoft(R) Windows(R) Server 2003, Standard Edition и Microsoft Windows 7 Professional.

.
2 голосов
/ 30 января 2011

Вы можете попробовать использовать элемент управления Microsoft Sysinfo , поставляемый с VB6, и проверить свойства OSPlatform, OSBuild и OSVersion на соответствие версии ОС #

1 голос
/ 02 октября 2016

Вот очень простой метод, который я использую для определения 32-битной и 64-битной операционной системы:

OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)

В 64-битной Windows ОС устанавливает переменную среды "PROGRAMFILES (X86)", ноне на 32-битных системах.Это еще не подвело меня ...

1 голос
/ 21 апреля 2016

Принятый ответ работал для моего приложения, пока я не попробовал его в 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.

0 голосов
/ 07 июля 2017

РАБОТАЕТ в 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)
0 голосов
/ 30 января 2011

Ах, нашел это! Лично я не использую этот класс, потому что для моих нужд это излишне, но это, безусловно, самый полный пример версии OpSys, который я встречал. Кредит на это идет к Кеннету Айвзу.

* Полагаю, StackOverflow не нравятся огромные блоки кода, поэтому класс (clsOperSystem.cls) находится в KiCrypt Demo , превосходной компиляции алгоритмов хеширования и шифрования.

...