|
Определение версии OS, проблемы с Version Helper functions - вообще не работают
|
|||
---|---|---|---|
#18+
Я всегда удовлетворялся определением версии ядра: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Вчера взглянул на Windows 8.1 - там должно быть 6.3, но не все так просто: GetVersionEx function GetVersionExApplications not manifested for Windows 8.1 will return the Windows 8 OS version value (6.2). Ладно, с этим справился: Targeting your application for Windows 8.1 Код: xml 1. 2.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Но версия ядра не делает различий между Windows 7 / Windows Server 2008 R2 Windows 8 / Windows Server 2012 и т.д. Хотелось бы определять имя OS в текстовом виде: Windows XP SP3 Windows Server 2008 R2 и т.д. Есть вариант читать из реестра, например: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Но он не очень хорош: Например для моей тестовой 8.1 выдает: Windows 8.1 Enterprise Evaluation . Т.е. может быть вставлен любой мусор типа Enterprise Evaluation что лишнее. Я нашел более современный метод: Version Helper functions Version Helper functionsThe following functions can be used to determine the current OS version or identify whether it is a Windows or Windows Server release. These APIs supersede GetVersion and GetVersionEx. Про их всех написано: DLL: Kernel32.dll, ntdll.dll Minimum supported client: Windows 2000 Professional [desktop apps only] Minimum supported server: Windows 2000 Server [desktop apps only] что вообще-то странно, потому что по логике откуда XP может знать про IsWindows8Point1OrGreater function Я попробовал задекларировать (причем пробовал варианты как Lib "ntdll.dll" так и Lib "Kernel32.dll"): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Проблема: при любом вызове любой из них (будь то на XP или 8.1) получаем: can't find DLL entry point IsWindows... in ntdll.dll (ну либо kernel32.dll) Или msdn врет, или я чего-то не понимаю (не дочитал). Где собака зарыта? Манифест, приведенный выше, прикручен, но конкретно с этими ф-циями так понимаю он вообще не причем. Ну, или поставим вопрос по другому. Как хотя б определить что система = СЕРВЕР (чтоб хотя б различать между 7 и 2008R2 для 6.1) - кроме способа чтения художественного описания из реестра как в коде выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2013, 11:52 |
|
Определение версии OS, проблемы с Version Helper functions - вообще не работают
|
|||
---|---|---|---|
#18+
Все, разобрался. Дмитрий77Я нашел более современный метод: Version Helper functions Version Helper functionsThe following functions can be used to determine the current OS version or identify whether it is a Windows or Windows Server release. These APIs supersede GetVersion and GetVersionEx. Я думаю что это ни фига не "модные" функции, а наспех написанные макросы определенные в versionhelpers.h Note These APIs are defined by versionhelpers.h, which is included in the Windows 8.1 software development kit (SDK). По ходу они операционки (Win 8/ 8.1) теперь также пишут через одно место. А для вычисления сервер/не сервер и SP делаем так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Ну и не забываем про манифест, чтоб на Win 8.1 фигню не писало (правильно 6.3, а без манифеста будет 6.2). Зная версию ядра и сервер/не сервер, названия операционок известны. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2013, 12:44 |
|
Определение версии OS, проблемы с Version Helper functions - вообще не работают
|
|||
---|---|---|---|
#18+
Дмитрий77Зная версию ядра и сервер/не сервер, названия операционок известны. можешь выложить свой полный код определения ос? мой способ. отличить xp от других. но он явнонеидеальный Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2014, 19:01 |
|
Определение версии OS, проблемы с Version Helper functions - вообще не работают
|
|||
---|---|---|---|
#18+
Клеверможешь выложить свой полный код определения ос? Вообще то код приведенный постом выше полный. А с учетом комментариев более чем полный. Ты что читать не умеешь? P.S. XP это 5.1 PP.S Или тебе надо полностью функцию написать кот. красиво пишет название OS в виде "Windows Vista Service Pack 2" ? Извини, но я еще для себя ее не написал, хотя это очень просто. 31-го утром времени хватило только на осознание сути. С Новым годом! PPP.S Но для тебя думаю сгодится вариант с реестром, приведенный постом выше. Ой, извини, не угодил, он не полный, не разжевана ф-ция GetRegValue. Ну, извини, не угодил. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2014, 19:55 |
|
Определение версии OS, проблемы с Version Helper functions - вообще не работают
|
|||
---|---|---|---|
#18+
Как-то так, если нигде не ошибся: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2014, 05:05 |
|
Определение версии OS, проблемы с Version Helper functions - вообще не работают
|
|||
---|---|---|---|
#18+
Дмитрий77, спасибо) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2014, 21:19 |
|
Определение версии OS, проблемы с Version Helper functions - вообще не работают
|
|||
---|---|---|---|
#18+
Я столкнулся с аналогичной проблемой и хотел поделиться своим опытом. Уточнение о Version Helper functions Version Helper functions - это всё же функции, но не макросы. Просто они и объявлены, и определены в заголовочном файле versionhelpers.h, входящем в состав Windows SDK 8.1. При этом функции объявлены с ключевым словом __forceinline. Поэтому эти функции будут присутствовать в объектном коде лишь при следующих условиях: Для разработки используется C/C++ (заголовочный файл versionhelpers.h можно включать в файлы исходного текста на C/C++). В коде присутствуют вызовы этих функций или присутствуют указатели на функции (иначе компилятор может просто не включить функции в объектный файл). Конечно ни в Kernel32.dll, ни в ntdll.dll Version Helper functions не содержатся. Очевидно, описание этих функций в MSDN не достаточно корректное. Кроме того, не понятно, как использовать Version Helper functions в программах, разработанных не на C/C++. В результате я тоже отказался от использования Version Helper functions. Недостаток GetVersionEx и манифеста приложения Использование функции GetVersionEx в Windows 8.1 и Windows Server 2012 R2 требует декларирования совместимости в манифесте приложения: Дмитрий77<!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> Однако на сегодняшний день неизвестно, каким будет идентификатор следующей ОС после Windows 8.1 и Windows Server 2012 R2. Поэтому весьма вероятно, что после выпуска очередной ОС от Microsoft манифест приложения придётся обновлять и выпускать его новую версию. Функции VerifyVersionInfo и VerSetConditionMask Можно обойтись и без манифеста за счёт отказа от использования функции GetVersionEx. Для сравнения версии текущей ОС с указанным значением можно воспользоваться функциями VerifyVersionInfo ( http://msdn.microsoft.com/library/windows/desktop/ms725492.aspx ) и VerSetConditionMask ( http://msdn.microsoft.com/library/windows/desktop/ms725493.aspx ). Эти функции экспортируются kernel32.dll, а также работают и без манифеста приложения. Для определения версии Windows удобно воспользоваться таблицей, содержащейся в разделе Remarks страницы описания структуры OSVERSIONINFOEX ( http://msdn.microsoft.com/library/windows/desktop/ms724833.aspx ). Пример использования функций VerifyVersionInfo и VerSetConditionMask можно найти в статье: http://www.codeproject.com/Articles/678606/Part1-Overcoming-Windows-8-1s-deprecation-of-GetVe. Успехов! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2014, 00:32 |
|
Определение версии OS, проблемы с Version Helper functions - вообще не работают
|
|||
---|---|---|---|
#18+
Petr Alexeev, На самом деле для корректного функционирования проги как таковой достаточно проверить версию ядра. Причем опыт показывает что для большинства задач достаточно проверить соответствие >=6.0 (Виста или выше), в редких случаях мне требовалось проверять >=6.1 (Win7 или выше), и единственный раз потребовалось реально знать про Win 8 Частенько существенна разница между XP(5.1) и Win2003(5.2), но в данном случае разные версии ядра, а вот сервера начиная с 2008-го от клиентских версий ничем не отличаются. Существенно x64 или win32, но это к данному вопросу никакого отношения не имеет. Поэтому все эти прибамбасы с сервер/не сервер либо версиями Service Pack не более чем для красоты (отображение имени OS). Что касается манифеста, у меня например прога адаптированная под Win8 (но не знавшая про 8.1) именно за счет его отсутствия не сделала одну ошибку потому что искренне считала версию =6.2 (Win8=), будучи запущенной на Win8.1 Ну а по поводу упомянутой таблицы, сильные уточнения ни к чему. Что касается всяких "Windows Home Server". Хотя меня раз клиент достал с этим "Home Server", пришлось его установить, чтоб понять что это самый обычный Win 2003, правда нарочно изгаженный зачем-то (инсталлятор уничтожает ВСЕ данные на ВСЕХ дисках и рабочий стол запрятан под интерфейс для придурков с надписью "НЕ ВЛЕЗАЙ -УБЬЕТ", хотя никакой реальной "защиты" от полноценного использования нет и последнее лечится очень легко штатными средствами) и продаваемый по цене $100 за штуку вместо стандартных $1000-4000. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2014, 04:02 |
|
|
start [/forum/topic.php?fid=60&msg=38520113&tid=2156588]: |
0ms |
get settings: |
12ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 151ms |
0 / 0 |