Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Определить версию Windows |
Автор: rudolfninja 12.8.2015, 18:35 | ||
Приветсвую всех. Столкнулся с такой проблемой, надо определить версию ОС, не используя GetVersionEx. Дело в том, что на msdn по поводу этой функции написано:
А мне как раз надо, чтоб мое приложение определяло, что оно работает на Windows 10. Вариант добавить в манифест приложения Windows 10 не подходит. Вот, собственно и вопрос: есть ли какие способы определить версию винды используя только user-mode функции (RtlGetVersion не подходит, т.к. она выполняется в kernel-моде). Спасибо. |
Автор: Alexeis 12.8.2015, 19:35 |
Ну собственно там же и написано что нужно делать https://msdn.microsoft.com/en-us/library/windows/desktop/dn424972(v=vs.85).aspx |
Автор: rudolfninja 12.8.2015, 23:41 | ||
Alexeis, ваш вариант не подходит, потому что предполагается, что программа будет использоваться и компилироваться под Windows XP (build server у нас на WinXP еще), а там нет нужного API.
Ситуация такова, что я пишу .dll, которая потом тянется из java-кода. Нынешняя версия java не понимает Windows10 и поэтому моя dll определяет ее как Windows 8. Поэтому мне надо как-то самому определить, что я работаю под Windows 10 |
Автор: Guinness 13.8.2015, 07:43 | ||
Имелось в виду, что нужно компилировать под 10ку? Ну, можно же вызывать функцию динамически, т.е. подгружать её на этапе исполнения с помощью LoadLibrary и GetProcAddress. Соответственно, предварительно проверив версию dll. |
Автор: rudolfninja 13.8.2015, 08:37 |
Ну да. Вот кстати, с версией dll, может просто попробовать определять версию dll, и если она такая же как на 10, то считать, что текущая ОС - Windows 10? |
Автор: Alexeis 13.8.2015, 10:05 | ||
Если функция IsWinows10 умеет возвращать false то очевидно, что она реализована не в библиотеке, а в SDK. С новым SDK под windows XP не сомпилишься, так что rudolfninja прав. В его ситуации не проканает. |
Автор: rudolfninja 13.8.2015, 10:24 |
Я вот что обнаружил, у kernel32.dll версия библиотеки в Windows 10 - 10.0.10240.16384, а в Windows 7, например, 6.1.7601.18847. Получается, что первые три разряда (числа), это majorVersion, minorVersion и buildNumber самой операционной системы. То есть, я могу получить версию библиотеки и проверить по ней. Есть какие-нибудь предположения, чем плох этот вариант? |
Автор: volatile 13.8.2015, 11:13 |
недокументированность нет гарантии что это будет работать на всех разновидностях системы. и что будет с будущими системами, тем более не ясно Можно попробовать заюзать VerifyVersionInfo, VerSetConditionMask Работают начиная с win 2000 пример использования http://www.codeproject.com/Articles/678606/Part1-Overcoming-Windows-8-1s-deprecation-of-GetVe там есть и еще варианты |
Автор: rudolfninja 13.8.2015, 11:23 | ||
Пробовал такой вариант, на Windows 10 дает отрицательный результат. Я ставил маску, чтоб dwMajorVersion был выше или равен 10, но все равно не срабатывает. Видимо, там внутри вызывается GetVersionEx, который возвращает, что текущая версия - Windows 8 |
Автор: Alexeis 13.8.2015, 11:32 |
Я проверил, versionhelpers.h, там реализация функций прям инлайн. Файлик приатачил к посту. С точки зрения ОС используется функция VerifyVersionInfoW, которая появилась в Windows 2000. Думаю можно использовать этот файлик с любым SDK. |
Автор: rudolfninja 13.8.2015, 12:22 | ||
Вот такой код на Windows 10 вернул false:
|
Автор: rudolfninja 13.8.2015, 12:58 |
Мне кажется, проблема в VerifyVersionInfoW, которая внутри себя вызывает GetVersionEx |
Автор: Alexeis 13.8.2015, 13:13 | ||
Добавлено через 45 секунд Чтоб функция работала похоже нужно манифест включить в экзешник |
Автор: rudolfninja 13.8.2015, 18:13 |
Решил проблему с помощью WMI. Получил из WMI строку с версией ОС и распарсил ее на нужные части. |