Как определить версию операционной системы с XP и выше..

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Как определить версию операционной системы с XP и выше..

Сообщение Vova_2581 » 03.04.2023 (Пн) 11:39

Здравствуйте, скажите, пожалуйста, как можно программно определить в какой именно системе запускается моя программа? То есть это Win XP или Win 7,10,11 ?? Как это программно определить?
Последний раз редактировалось Vova_2581 05.04.2023 (Ср) 10:14, всего редактировалось 1 раз.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как определить систему

Сообщение Teranas » 03.04.2023 (Пн) 18:33

Я так понял ты ищешь что-то типа такого:
Код: Выделить всё
Attribute VB_Name = "ModWinVer"
Option Explicit
Private Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer
Private Const PLATFORM_WIN32s        As Integer = 0
Private Const PLATFORM_WIN32_WINDOWS As Integer = 1
Private Const PLATFORM_WIN32_NT      As Integer = 2
Private Type OSVERSIONINFO          'OS Version info, for querying the windows version.
    dwOSVersionInfoSize             As Long
    dwMajorVersion                  As Long
    dwMinorVersion                  As Long
    dwBuildNumber                   As Long
    dwPlatformId                    As Long
    szCSDVersion                    As String * 128
End Type
Public Function GetVersionString() As String
    Dim osinfo                      As OSVERSIONINFO
    Dim retvalue                    As Integer
    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    retvalue = GetVersionExA(osinfo) 'Get Version
    With osinfo
        Select Case .dwPlatformId
            Case 1 'If Platform is 9x/Me
                Select Case .dwMinorVersion 'Depends on Minor Version now.
                    Case 0
                        GetVersionString = "Windows 95"
                    Case 10
                        GetVersionString = "Windows 98"
                    Case 90
                        GetVersionString = "Windows Mellinnium"
                End Select
            Case 2 'NT Based
                Select Case .dwMajorVersion 'Depends on Major version this time.
                    Case 3
                        GetVersionString = "Windows NT 3.51"
                    Case 4
                        GetVersionString = "Windows NT 4.0"
                    Case 5
                        If .dwMinorVersion = 0 Then
                            GetVersionString = "Windows 2000"
                        Else
                            GetVersionString = "Windows XP"
                        End If
                End Select
            Case Else
                GetVersionString = "Failed" 'Don't think this should ever happen unless you are using a new windows I haven't heard of yet =)
        End Select
    End With
End Function
Public Function GetVersion() As Long
    Dim osinfo                      As OSVERSIONINFO
    Dim retvalue                    As Integer
    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    retvalue = GetVersionExA(osinfo)
    GetVersion = osinfo.dwPlatformId 'Just return the platform ID, good for checking for NT / Win 32 (1 = Win 32 , 0 = NT)
End Function
Public Function IsWinNT() As Boolean
    'Returns True if the current operating system is WinNT
    Dim osvi                        As OSVERSIONINFO
    osvi.dwOSVersionInfoSize = Len(osvi)
    GetVersionExA osvi
    IsWinNT = (osvi.dwPlatformId = PLATFORM_WIN32_NT)
End Function

С уважением, Андрей.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как определить систему

Сообщение Vova_2581 » 03.04.2023 (Пн) 19:33

Да... верно. Только именно этот код очень устарел. Все эти win 95, 98, Millennium, NT, 2000 - все это уже давно покоиться на кладбище. Это не интересует вообще. Нужно только то, что ещё используется XP и все, что выше... Как я понял нужно копать в сторону функции GetVersionExA не знаю, но возможно в структуре, которую она заполняет будут другие значения "мажоров", "миноров" - номеров версий и т.д., которые будут соответствовать именно тому, что нужно. Ну это нужно поизучать... попробую... Спасибо за подсказку.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как определить версию операционной системы с XP и выше..

Сообщение Vova_2581 » 05.04.2023 (Ср) 10:13

Ну, что можно сказать... вот эта древняя функция GetVersionEx, наверное, еще динозавров помнит.
Она не подымается выше Win 7. Еще кое-как можно за уши вытянуть Win 10, но дальше... значения Major, Minor тупо повторяются и понять, где 10, а где 11 уже нельзя.
Этот код годится только для Windows XP и Windows 7, максимум Win 10, дальше... уже нет.
Код: Выделить всё
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type

Private Sub Form_Load()
Dim OSInfo As OSVERSIONINFO
Dim vMajor, vMinor As Long
OSInfo.dwOSVersionInfoSize = Len(OSInfo)
If GetVersionEx(OSInfo) = 0 Then
  MsgBox "Ошибка в получении версии операционной системы!", vbExclamation
  Exit Sub
Else
  vMajor = OSInfo.dwMajorVersion
  vMinor = OSInfo.dwMinorVersion
  If vMajor = 5 And vMinor = 1 Then MsgBox "Установлена операционная система Windows XP", vbInformation
  If vMajor = 6 And vMinor = 1 Then MsgBox "Установлена операционная система Windows 7", vbInformation
  If vMajor = 6 And vMinor = 2 Then MsgBox "Установлена операционная система Windows 10", vbInformation
End If
End Sub

Погуглил... узнал, что для определения версии системы можно использовать WMI класс Win32_OperatingSystem, но и тут засада... он не определяет XP...
Этот код работает только с Win 7 и выше... на Win XP выбивает ошибку...
Код: Выделить всё
Private Sub Form_Load()
On Error GoTo ErrInfo
Dim oWMI As Object
Dim oOSs As Object
Dim oOS  As Object

Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set oOSs = oWMI.ExecQuery("SELECT Caption, Version, OSArchitecture FROM Win32_OperatingSystem")

For Each oOS In oOSs
  MsgBox oOS.Caption & " " & oOS.Version & " (" & oOS.OSArchitecture & ")"
Next

Set oOS = Nothing
Set oOSs = Nothing
Set oWMI = Nothing
Exit Sub
ErrInfo:
MsgBox "Ошибка: " & Err.Number & " " & Err.Description, vbExclamation, App.Title
End Sub

В общем, решил объединить API & WMI...
Этот код определяет версию системы начиная уже с Win XP и все, что выше...
Код: Выделить всё
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type

Private Sub Form_Load() 'API & WMI... Работает начиная с Win XP и выше...
On Error GoTo ErrInfo
Dim OSInfo As OSVERSIONINFO
OSInfo.dwOSVersionInfoSize = Len(OSInfo)
If GetVersionEx(OSInfo) <> 0 Then
  If OSInfo.dwMajorVersion = 5 And OSInfo.dwMinorVersion = 1 Then
   MsgBox "Установлена операционная система Windows XP", vbInformation
   Exit Sub
  End If
  If OSInfo.dwMajorVersion = 6 Then
   Dim oWMI As Object
   Dim oOSs As Object
   Dim oOS  As Object

   Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
   Set oOSs = oWMI.ExecQuery("SELECT Caption, Version, OSArchitecture FROM Win32_OperatingSystem")

   For Each oOS In oOSs
    MsgBox oOS.Caption & " " & oOS.Version
   Next

   Set oOS = Nothing
   Set oOSs = Nothing
   Set oWMI = Nothing
  End If
End If
Exit Sub

ErrInfo:
MsgBox "Ошибка: " & Err.Number & " " & Err.Description, vbExclamation, App.Title
End Sub
Вложения
GetOSInfo API&WMI.rar
Версия операционной системы с XP и выше...
(1.57 Кб) Скачиваний: 24

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как определить версию операционной системы с XP и выше..

Сообщение Хакер » 05.04.2023 (Ср) 12:39

А может быть стоит почитать документацию на GeVersionEx?

Документация на GetVersionEx писал(а):GetVersionExA may be altered or unavailable for releases after Windows 8.1. Instead, use the Version Helper functions. For Windows 10 apps, please see Targeting your applications for Windows.

With the release of Windows 8.1, the behavior of the GetVersionEx API has changed in the value it will return for the operating system version. The value returned by the GetVersionEx function now depends on how the application is manifested.

Applications not manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version value (6.2). Once an application is manifested for a given operating system version, GetVersionEx will always return the version that the application is manifested for in future releases. To manifest your applications for Windows 8.1 or Windows 10, refer to Targeting your application for Windows.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как определить версию операционной системы с XP и выше..

Сообщение Vova_2581 » 05.04.2023 (Ср) 12:55

Ну вот я же и говорю именно эта функция "древняя и помнит еще динозавров"... ))))))
Instead, use the Version Helper functions
Это уже интересно, Спасибо!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как определить версию операционной системы с XP и выше..

Сообщение Vova_2581 » 05.04.2023 (Ср) 16:37

Пока особо не вникал, но глядя поверхностно... у всех этих функций по вашим ссылкам, смущает одинаковое окончание "...OrGreater" - типа "или выше...". И что-то мне подсказывает, что из-за этого, отвечать она будет очень не конкретно. Ну, типа на вопрос: "это ХР?" (IsWindowsXPOrGreater) ответит True на всех системах. ))

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как определить версию операционной системы с XP и выше..

Сообщение Хакер » 06.04.2023 (Чт) 13:11

IsWindowsXpExactly = IsWindowsXpOrGreater and not IsWindowsVistaOrGreater.

С другой стороны, я бы назвал правильной тактикой вызывать сначала GetVersionEx, и только если выясняется, что ОС похожа на одну из тех, которая выпущена после разжижения мозгов в MS, и которая может возвращать поддельные значения, выдавая себя за Windows 8, то только тогда используем новые API.

Но вообще, IsWindowsXPOrGreater (и ей подобных) как самостоятельных экспортируемых функций нет (насколько я могу судить, не глядя на таблицу экспорта самой DLL-ки) — это всё обёртки над реально экспортируемой VerifyVersionInfo. А вот уже VerifyVersionInfo позволяет делать точные или какие угодно сравнения (=, <, >, <=, >=, <>).

И ещё раз скажу: сперва нужно пытаться вызвать GetVersionEx, а только потом дёргать новоиспечённые API. Потому что под Windows 98, Windows 2000 никаких новых API нет. Не собираешься поддерживать Windows 2000, считая, что это древность, и ею никто не пользуются? Во-первых, это не так — пользуются. Во-вторых, даже если не собираешься, тебе сначала нужно определить, что это Windows 2000 и выдать красивое вежливое понятное сообщение, что Windows 2000 не поддерживается твоей программой, а не «упасть» с некрасивой и непонятной пользователю ошибкой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как определить версию операционной системы с XP и выше..

Сообщение Vova_2581 » 06.04.2023 (Чт) 14:43

Понятно. Попробуем... Спасибо за разъяснения.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как определить версию операционной системы с XP и выше..

Сообщение The trick » 06.04.2023 (Чт) 19:41

UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как определить версию операционной системы с XP и выше..

Сообщение Хакер » 06.04.2023 (Чт) 21:31

The trick писал(а):RtlGetVersion

Шутишь? Это же kernel-mode/ring-0 функция.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как определить версию операционной системы с XP и выше..

Сообщение The trick » 06.04.2023 (Чт) 22:00

Хакер писал(а):
The trick писал(а):RtlGetVersion

Шутишь? Это же kernel-mode/ring-0 функция.

ntdll экспортирует также.
UA6527P


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 38

    TopList