[субкирпич] определение версии Windows

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

[субкирпич] определение версии Windows

Сообщение tyomitch » 10.10.2005 (Пн) 18:15

Проверено в Win95, Win98 SE, Win2000 Pro и AS, WinXP Pro, и бете Висты.
Неплохо, если кто-нибудь проверит в WinNT4, WinXP Home, или какой-нибудь серверной версии.
Замечания и ссылки на уже существующий код с такой же функциональностью приветствуются.

Код: Выделить всё
Option Explicit

Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2

Private Const VER_NT_WORKSTATION = 1
Private Const VER_NT_DOMAIN_CONTROLLER = 2
Private Const VER_NT_SERVER = 3

Private Const VER_SERVER_NT = &H80000000
Private Const VER_WORKSTATION_NT = &H40000000
Private Const VER_SUITE_SMALLBUSINESS = &H1&
Private Const VER_SUITE_ENTERPRISE = &H2&
Private Const VER_SUITE_BACKOFFICE = &H4&
Private Const VER_SUITE_COMMUNICATIONS = &H8&
Private Const VER_SUITE_TERMINAL = &H10&
Private Const VER_SUITE_SMALLBUSINESS_RESTRICTED = &H20&
Private Const VER_SUITE_EMBEDDEDNT = &H40&
Private Const VER_SUITE_DATACENTER = &H80&
Private Const VER_SUITE_SINGLEUSERTS = &H100&
Private Const VER_SUITE_PERSONAL = &H200&
Private Const VER_SUITE_BLADE = &H400&


Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Integer
    wMinorVersion As Byte '9x-only
    wMajorVersion As Byte '9x-only
    dwPlatformId As Long
    szCSDVersion(1 To 128) As Byte
End Type

Private Type OSVERSIONINFOEX
    osvi As OSVERSIONINFO
    wServicePackMajor As Integer
    wServicePackMinor As Integer
    wSuiteMask As Integer
    wProductType As Byte
    wReserved As Byte
End Type

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long


Public Function winver() As String
Dim osvix As OSVERSIONINFOEX
    osvix.osvi.dwOSVersionInfoSize = Len(osvix)
    If 0 = GetVersionEx(osvix.osvi) Then
        osvix.osvi.dwOSVersionInfoSize = Len(osvix.osvi)
        If 0 = GetVersionEx(osvix.osvi) Then
            winver = "(unknown)"
            Exit Function
        End If
    End If
   
    Select Case osvix.osvi.dwPlatformId
    Case VER_PLATFORM_WIN32_NT:
        Select Case osvix.osvi.dwMajorVersion
        Case 3, 4:  winver = "Windows NT"
        Case 5:
            Select Case osvix.osvi.dwMinorVersion
            Case 0: winver = "Windows 2000"
            Case 1: winver = "Windows XP"
            Case 2: winver = "Windows 2003"
            Case Else:
                    winver = "(Windows NT 5.x)"
            End Select
        Case 6:     winver = "Windows Vista"
        Case Else:  winver = "(Windows NT)"
        End Select
           
        If Len(osvix) = osvix.osvi.dwOSVersionInfoSize Then
            Select Case osvix.wProductType
            Case VER_NT_SERVER, VER_NT_DOMAIN_CONTROLLER:
                If osvix.wSuiteMask And VER_SUITE_DATACENTER Then
                    winver = winver & " Datacenter"
                ElseIf osvix.wSuiteMask And VER_SUITE_ENTERPRISE Then
                    winver = winver & " Advanced Server"
                Else
                    winver = winver & " Server"
                End If
            Case VER_NT_WORKSTATION:
                If osvix.osvi.dwMajorVersion < 5 Then
                    winver = winver & " Workstation"
                ElseIf osvix.wSuiteMask And VER_SUITE_PERSONAL Then
                    winver = winver & " Home"
                Else
                    winver = winver & " Professional"
                End If
            Case Else:
                'no append
            End Select
        End If
    Case VER_PLATFORM_WIN32_WINDOWS:
        Select Case osvix.osvi.dwMajorVersion
        Case 4:
            Select Case osvix.osvi.dwMinorVersion
            Case 0:     winver = "Windows 95"
            Case 10:    winver = "Windows 98"
            Case 90:    winver = "Windows Me"
            Case Else:  winver = "(Windows 9x)"
            End Select
        Case Else:  winver = "(Windows)"
        End Select
    Case Else:
        winver = "(unknown)"
    End Select
   
    winver = winver & ", ver. " & osvix.osvi.dwMajorVersion & "." & osvix.osvi.dwMinorVersion & "." & osvix.osvi.dwBuildNumber
    If Len(osvix) = osvix.osvi.dwOSVersionInfoSize Then
        If osvix.wServicePackMajor Then
            winver = winver & " SP" & osvix.wServicePackMajor
            If osvix.wServicePackMinor Then
                winver = winver & "." & osvix.wServicePackMinor
            End If
        End If
    End If
End Function
Изображение

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 10.10.2005 (Пн) 19:37

Windows Server 2003, работоспособность подтверждаю ;)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.10.2005 (Пн) 23:12

Дык Тёмыч, нафига? :) Ведь будут же выходить новые винды :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2005 (Вт) 7:52

Чтобы работало хотя бы с теми, что уже вышли :-)
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.10.2005 (Вт) 10:57

Погонял. Из найденного: на W2K3 Standard Edition не пишет, какой это edition. Дома вечером проверю на Enterprise, но подозреваю, что там будет то же самое.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 11.10.2005 (Вт) 12:30

с XP Home всё ок
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2005 (Вт) 18:38

Ennor писал(а):Погонял. Из найденного: на W2K3 Standard Edition не пишет, какой это edition. Дома вечером проверю на Enterprise, но подозреваю, что там будет то же самое.

Спасибо, что нашёл! :salut:
Расскажи, какие там значения записывается в osvix.wProductType и osvix.wSuiteMask?
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 11.10.2005 (Вт) 20:25

Я уже приводил код чтения версии из реестра (CurrentVersion). Работает и на 9х, и на 2000/XP/2003 + должно работать и на будущих версиях Windows. А твой код заточен лишь под существующие. И зачем тогда это нужно?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2005 (Вт) 20:53

BV писал(а):Я уже приводил код чтения версии из реестра (CurrentVersion). Работает и на 9х, и на 2000/XP/2003 + должно работать и на будущих версиях Windows. А твой код заточен лишь под существующие. И зачем тогда это нужно?

Твой код не нашёл.

Подожди, а если я в этом ключе напишу "Super Duper Windows 2017 Mega Server", то как твоя прога себя поведёт? ;-)
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 11.10.2005 (Вт) 21:40

Подожди, а если я в этом ключе напишу "Super Duper Windows 2017 Mega Server", то как твоя прога себя поведёт? ;-)


Ну да, с чего бы тебе ключи переписывать? :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2005 (Вт) 23:01

А специально, чтобы твою прогу за нос водить. Кстати, где всё-таки она?
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 11.10.2005 (Вт) 23:19

Кстати, где всё-таки она?


Кто она? :roll:
Я просто приводил код для чтения ключей из CurrentVersion (как удобный метод): http://bbs.vbstreets.ru/viewtopic.php?t ... amfilesdir
Что до моих программ - этот код использует, например, EasyPlayer: http://bv.vbland.net/Download/EasyPlayer_14.rar
Последний раз редактировалось BV 11.10.2005 (Вт) 23:22, всего редактировалось 2 раз(а).
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.10.2005 (Вт) 23:19

:shock: А на Enterprise все еще веселее, не поверите:
Windows 2003 Advanced Server, ver. 5.2.3790

А, все, вижу. Вот этот разрез:
Код: Выделить всё
ElseIf osvix.wSuiteMask And VER_SUITE_ENTERPRISE Then
  winver = winver & " Advanced Server"

тебе придется умножить на множество значений osvix.osvi.dwMinorVersion.

А когда выйдет Vista Server, придется еще поднапрячься, разгребая это все, м-дя...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2005 (Вт) 23:42

BV, ну вижу код... И как он отличит Advanced Server от Enterprise?

Ennor, какие всё-таки значения у osvix.wProductType и osvix.wSuiteMask в 2003 Standard и 2003 Enterprise?
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 11.10.2005 (Вт) 23:48

А ты посмотри, сколько ключей в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows (NT?)\CurrentVersion.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2005 (Вт) 23:51

BV, только что оттуда. Аналога для wProductType/wSuiteMask там нет.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 11.10.2005 (Вт) 23:57

Не знаю, не интересовался - но есть ProductName, ProductType, VersionNumber, SubVersionNumber...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.10.2005 (Ср) 0:11

Windows 2003 Server, ver. 5.2.3790 SP1
osvix.wProductType = 3
osvix.wSuiteMask = 272

Windows 2003 Advanced Server, ver. 5.2.3790
osvix.wProductType = 3
osvix.wSuiteMask = 274


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

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

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 39

    TopList