Определение версии 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
и т.д.
Есть вариант читать из реестра, например:
Но он не очень хорош:
Например для моей тестовой 8.1 выдает:
Windows 8.1
Т.е. может быть вставлен любой мусор типа Enterprise Evaluation что лишнее.
Я нашел более современный метод:
Version Helper functions
Про их всех написано:
что вообще-то странно, потому что по логике откуда XP может знать про IsWindows8Point1OrGreater function
Я попробовал задекларировать (причем пробовал варианты как Lib "ntdll.dll" так и Lib "Kernel32.dll"):
Манифест, приведенный выше, прикручен, но конкретно с этими ф-циями так понимаю он вообще не причем.
Ну, или поставим вопрос по другому.
Как хотя б определить что система = СЕРВЕР (чтоб хотя б различать между 7 и 2008R2 для 6.1) - кроме способа чтения художественного описания из реестра как в коде выше.
Вчера взглянул на 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д