![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Приветсвую всех.
Столкнулся с такой проблемой, надо определить версию ОС, не используя GetVersionEx. Дело в том, что на msdn по поводу этой функции написано:
А мне как раз надо, чтоб мое приложение определяло, что оно работает на Windows 10. Вариант добавить в манифест приложения Windows 10 не подходит. Вот, собственно и вопрос: есть ли какие способы определить версию винды используя только user-mode функции (RtlGetVersion не подходит, т.к. она выполняется в kernel-моде). Спасибо. Это сообщение отредактировал(а) rudolfninja - 13.8.2015, 12:16 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Ну собственно там же и написано что нужно делать https://msdn.microsoft.com/en-us/library/wi...2(v=vs.85).aspx
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
MicroSoft дурит, конечно.
Почему? Вот здесь обещано:
Народ вызывает и в user-mode... Но, говорят, и она врёт:
Alexeis, спасибо за ссылку. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Alexeis, ваш вариант не подходит, потому что предполагается, что программа будет использоваться и компилироваться под Windows XP (build server у нас на WinXP еще), а там нет нужного API.
Ситуация такова, что я пишу .dll, которая потом тянется из java-кода. Нынешняя версия java не понимает Windows10 и поэтому моя dll определяет ее как Windows 8. Поэтому мне надо как-то самому определить, что я работаю под Windows 10 |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Имелось в виду, что нужно компилировать под 10ку? Ну, можно же вызывать функцию динамически, т.е. подгружать её на этапе исполнения с помощью LoadLibrary и GetProcAddress. Соответственно, предварительно проверив версию dll. |
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
||||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Если функция IsWinows10 умеет возвращать false то очевидно, что она реализована не в библиотеке, а в SDK. С новым SDK под windows XP не сомпилишься, так что rudolfninja прав. В его ситуации не проканает. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Я вот что обнаружил, у kernel32.dll версия библиотеки в Windows 10 - 10.0.10240.16384, а в Windows 7, например, 6.1.7601.18847. Получается, что первые три разряда (числа), это majorVersion, minorVersion и buildNumber самой операционной системы. То есть, я могу получить версию библиотеки и проверить по ней.
Есть какие-нибудь предположения, чем плох этот вариант? |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
недокументированность нет гарантии что это будет работать на всех разновидностях системы. и что будет с будущими системами, тем более не ясно Можно попробовать заюзать VerifyVersionInfo, VerSetConditionMask Работают начиная с win 2000 пример использования http://www.codeproject.com/Articles/678606...cation-of-GetVe там есть и еще варианты |
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Пробовал такой вариант, на Windows 10 дает отрицательный результат. Я ставил маску, чтоб dwMajorVersion был выше или равен 10, но все равно не срабатывает. Видимо, там внутри вызывается GetVersionEx, который возвращает, что текущая версия - Windows 8 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Я проверил, versionhelpers.h, там реализация функций прям инлайн. Файлик приатачил к посту. С точки зрения ОС используется функция VerifyVersionInfoW, которая появилась в Windows 2000. Думаю можно использовать этот файлик с любым SDK.
Присоединённый файл ( Кол-во скачиваний: 8 ) ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Вот такой код на Windows 10 вернул false:
Это сообщение отредактировал(а) rudolfninja - 13.8.2015, 12:23 |
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Мне кажется, проблема в VerifyVersionInfoW, которая внутри себя вызывает GetVersionEx
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Добавлено через 45 секунд Чтоб функция работала похоже нужно манифест включить в экзешник -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Решил проблему с помощью WMI. Получил из WMI строку с версией ОС и распарсил ее на нужные части.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |