Определение версии OS, проблемы с Version Helper functions - вообще не работают - VB

Узнай цену своей работы

Формулировка задачи:

Я всегда удовлетворялся определением версии ядра:

Вчера взглянул на Windows 8.1 - там должно быть 6.3, но не все так просто:
GetVersionEx function

Ладно, с этим справился:
Targeting your application for Windows 8.1


Но версия ядра не делает различий между
Windows 7 / Windows Server 2008 R2
Windows 8 / Windows Server 2012
и т.д.

Хотелось бы определять имя OS в текстовом виде:
Windows XP SP3
Windows Server 2008 R2
и т.д.


Есть вариант читать из реестра, например:

Но он не очень хорош:
Например для моей тестовой 8.1 выдает:
Windows 8.1

Enterprise Evaluation

.
Т.е. может быть вставлен любой мусор типа Enterprise Evaluation что лишнее.
Я нашел более современный метод:
Version Helper functions

Про их всех написано:

что вообще-то странно, потому что по логике откуда XP может знать про IsWindows8Point1OrGreater function
Я попробовал задекларировать (причем пробовал варианты как Lib "ntdll.dll" так и Lib "Kernel32.dll"):

Проблема: при любом вызове любой из них (будь то на XP или 8.1) получаем:
can't find DLL entry point IsWindows... in ntdll.dll (ну либо kernel32.dll)


Или msdn врет, или я чего-то не понимаю (не дочитал). Где собака зарыта?


Манифест, приведенный выше, прикручен, но конкретно с этими ф-циями так понимаю он вообще не причем.
Ну, или поставим вопрос по другому.
Как хотя б определить что система = СЕРВЕР (чтоб хотя б различать между 7 и 2008R2 для 6.1) - кроме способа чтения художественного описания из реестра как в коде выше.

Решение задачи: «Определение версии OS, проблемы с Version Helper functions - вообще не работают»

textual
Листинг программы
Public Function GetWinVersion() As String
  Dim osv As OSVERSIONINFOEX
  osv.dwOSVersionInfoSize = Len(osv)
  If GetVersionEx(osv) = 1 Then
    If osv.dwPlatformId = VER_PLATFORM_WIN32_NT Then
      Select Case osv.dwMajorVersion
        Case 5:
          Select Case osv.dwMinorVersion
            Case 1:
              GetWinVersion = "Windows XP"
            Case 2:
              If GetSystemMetrics(SM_SERVERR2) <> 0 Then
                GetWinVersion = "Windows Server 2003 R2"
              Else
                GetWinVersion = "Windows Server 2003"
              End If
            Case Else
          End Select
        Case 6:
          Select Case osv.dwMinorVersion
            Case 0:
              GetWinVersion = _
               IIf(osv.wProductType <> VER_NT_WORKSTATION, "Windows Server 2008", "Windows Vista")
            Case 1:
              GetWinVersion = _
               IIf(osv.wProductType <> VER_NT_WORKSTATION, "Windows Server 2008 R2", "Windows 7")
            Case 2:
              GetWinVersion = _
               IIf(osv.wProductType <> VER_NT_WORKSTATION, "Windows Server 2012", "Windows 8")
            Case 3: 'манифест!!!
              GetWinVersion = _
               IIf(osv.wProductType <> VER_NT_WORKSTATION, "Windows Server 2012 R2", "Windows 8.1")
            Case Else
          End Select
        Case Else
      End Select
      
      If GetWinVersion <> "" Then
        GetWinVersion = _
         GetWinVersion & IIf(osv.wServicePackMajor <> 0, " SP" & CStr(osv.wServicePackMajor), "")
      Else
        If osv.dwMajorVersion >= 6 Then
          'условно - для будущих версий Windows
          GetWinVersion = _
           IIf(osv.wProductType <> VER_NT_WORKSTATION, "Windows Server 2012 R2", "Windows 8.1")
        End If
      End If
    End If
  End If
End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5