0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
|
||||||
1 | ||||||
Получение версии Windows13.09.2017, 23:22. Показов 10687. Ответов 34
Метки нет (Все метки)
Здравствуйте, дорогие форумчане! Столкнулся со следующей проблемой. Есть код, который с помощью системной библиотеки определяет версию Windows. Вот он:
Вызвано исключение по адресу 0x766A2410 (user32.dll) в WindowsProject1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x000016C6. Не знаю как исправить. Надеюсь на Вашу помощь.
0
|
13.09.2017, 23:22 | |
Ответы с готовыми решениями:
34
Есть ли какие - то ограничения по минимальной версии Windows / Linux для последней версии Qt? Получение версии файла Получение сведений о версии ОС Резервное получение версии программы |
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|||||||||||
14.09.2017, 10:34 | 2 | ||||||||||
Первое: проверяйте что возвращают функция winAPI, в данном случае -
GetProcAddress .Второе:
_tcscat или std::basic_string<TCHAR> Добавлено через 9 минут
0
|
Ушел с форума
|
|
14.09.2017, 12:01 | 3 |
0
|
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
|
|
14.09.2017, 13:37 [ТС] | 4 |
Operok, спасибо, исправлю, не знал. Что возвращает функция - проверю ещё раз и напишу!)
Добавлено через 1 минуту Убежденный, функция не устраивает тем, что она возвращает одни и тоже значения для всех операционных систем, начиная с Windows 8.
0
|
Ушел с форума
|
|
14.09.2017, 13:48 | 5 |
alex9816, так это довольно легко исправляется добавлением блоков 'compatibility' в
манифест приложения, о чем, кстати говоря, документация на GetVersionEx открыто пишет: реальные значения dwMajorVersion/dwMinorVersion, если в манифесте нет нужных блоков.
0
|
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
|
|
14.09.2017, 13:53 [ТС] | 6 |
Убежденный, а можно пример реализации с блоками совместимости?
0
|
Ушел с форума
|
|
14.09.2017, 13:55 | 7 |
Глянь еще вот здесь:
Ошибка при сравнении строк Тут как-то уже писали, что GetVersion(Ex) и RtlGetVersion - это, по сути, одно и то же. И "неправильные" номера будут в обоих вариантах. Если уж на то пошло, тогда брать номер версии следует из RtlGetNtVersionNumbers или читать из PEB. Про манифесты есть здесь (особенно нижнюю ссылку, там есть пример манифеста с блоком 'compatibility' для Windows 10). Манифест Как подключить указанный манифест, чтобы нормально определять Windows 10 через getversionex() ?
0
|
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
|
|
14.09.2017, 14:09 [ТС] | 8 |
Убежденный, а подключать xml файл как в проект? Как в примере? Без #include?
0
|
Ушел с форума
|
|
14.09.2017, 14:22 | 9 |
Тебе нужно добавить его в ресурсы. ID ресурса = 1, тип = 24. Как именно ты это сделаешь - не важно
(есть несколько способов, вплоть до редактирования файла .rc вручную). Ах, да, в Visual C++ компоновщик создает дефолтный манифест, так что если ты добавляешь свой, то дефолтный нужно отключить (см. свойства проекта, раздел Linker, поставь там Generate Manifest = No).
0
|
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
|
|
14.09.2017, 23:30 [ТС] | 10 |
Убежденный, хорошо, буду пробовать)
Добавлено через 5 часов 21 минуту Убежденный, отключил создание манифеста в свойствах. Создал файл манифеста аналогично Вашему и подключил его. Теперь на этапе компиляции возникает ошибка, связанная с файлом манифеста. Добавлено через 10 минут Убежденный, исправил, пересобрав проект Добавлено через 3 часа 13 минут в какой они библиотеке находятся? Добавлено через 16 минут Здесь появляется ошибка: недопустимый вызов функции в константном выражении.
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
||||||
14.09.2017, 23:34 | 11 | |||||
_tcscat - <tchar.h>std::basic_string - <string>Добавлено через 2 минуты сори...
0
|
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
|
||||||
14.09.2017, 23:42 [ТС] | 12 | |||||
Да, это уже нашёл, а вот последнюю ошибку не знаю как исправить.
Добавлено через 37 секунд Сейчас попробую, спасибо! Добавлено через 2 минуты Operok,
Добавлено через 1 минуту Передавать по ссылке? Добавлено через 3 минуты "Windows" и "." выводятся иероглифами. Замена TCHAR на _T не помогла.
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|
15.09.2017, 09:27 | 13 |
0
|
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
|
|
15.09.2017, 22:32 [ТС] | 14 |
Operok, видимо, потому что до конца ещё не разобрался)
Спасибо, буду пробовать) Добавлено через 12 часов 52 минуты Operok, не работает вывод. Вместо windows и . просто квадраты выводятся Добавлено через 1 минуту Operok, использую:
0
|
20.09.2017, 21:51 | 15 |
Тем, что она с рандомным шансом на Win 8.1 / 10 на некоторых системах может вернуть версию 6.2 (т.е. Windows 8) даже при наличии манифеста совместимости. При чём может выдавать каждый раз разную версию для одной и той же машины.
Пруф - логи моих программ на VB6 с одного из ПК юзеров (на AutoIt, кстати, тоже). Я конечно не исключаю, что виртуализация через VB6 рантайм или особые опции линковщика накладывают какие-то свои искажения. В программе честный вызов обеих функций через отложенную загрузку dll (см. GetVersion.exe). При том, что GetVersionEx у меня работала исправно на 99% машин. Если есть желание, можешь собрать тестовую утилиту (желательно с сурцами). У меня остался на примете активный юзер с Win10, у которого воспроизводилась эта проблема. Могу попытаться попросить его протестировать. P.S. Кстати, на его тестах (на моих тоже) RtlGetVersion нормально отрабатывает и без манифеста совместимости. Как то не хочется экспериментировать в своей программе с непроверенной инфой (хотя, если хочешь, можешь и такой тест написать). Просто RtlGetVersion как-бы "рекомендует" Майкрософт, ведь:
Сообщение от MSDN
А что она делает, RtlGetNtVersionNumbers и на каком уровне документированна? На сколько я понял, читает версию из PEB подгруженной ntdll.dll ?
0
|
Ушел с форума
|
|||||||||||
21.09.2017, 11:03 | 16 | ||||||||||
Да, пользователь может запустить приложение в режиме совместимости с какой-нибудь Windows Vista.
И тогда GetVersionEx будет возвращать 6.0, независимо от манифеста. Этого никто не отменял. И такое же поведение будет у RtlGetVersion. GetVersionEx и RtlGetVersion - это одно и то же. Точнее говоря, первая является оберткой над второй. Вот код GetVersionExW из Windows 10 (x64):
завтра будет точно также. Где он ее рекомендует? Зачем гуглить? Открываем заголовки последних Windows SDK, там все есть:
---- Вообще, я против использования каких-либо недокументированных путей без крайней нужды. Только это хотел подчеркнуть. Если нужно получить номер версии - то делать это следует сначала "официальными" средствами (GetVersionEx + манифест). И только в том случае, если это не устраивает и если позарез нужно получить "настоящий" номер версии, независимо от настроек compatibility и т.п., использовать всякие подводные низкоуровневые примочки.
1
|
21.09.2017, 22:19 | 17 | |||||
Это да, хотя compatiblity shim почему-то не действует на GetVersionEx, запущенный из-под приложения на VB6.
Тем не менее, они показывают различное поведение: 1) RtlGetVersion на С++ без манифеста совместимости показывает правильную версию на win10, в отличие от GetVersionEx. Проверял на таком коде:
2) RtlGetVersion на VB6 для некоторых систем показывает правильный результат в отличие от GetVersionEx. Пруф. Спасибо за цитату. Да, не посмотрел я SDK, меня сбил с толку этот код VersionHelpers.h И здесь похоже ты тоже прав, по моей же первой ссылке на кибере видно, что обе функции выдали одинаково неверный результат по непонятной причине.
0
|
Ушел с форума
|
|
21.09.2017, 23:05 | 18 |
Надо под отладчиком смотреть. Возможно, там работает другая compatibility shim
Я раза два или три сталкивался с тем, что у RtlGetVersion "показания" тоже были "сбивчивые", причем приложение с манифестом + compatibility/trustInfo и никакие настройки совместимости не были задействованы. Один раз это было в процессе установщика (msiexec.exe), второй - ... уже и не помню, где именно. Причем один человек из MS на Technet писал, что RtlGetVersion, в отличие от GetVersionEx, не является частью compatibility shim (OsVersionLie) и, по идее, вообще не должна виртуализироваться...
1
|
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
|
||||||
02.10.2017, 09:34 [ТС] | 19 | |||||
Operok, не подскажете, как таким же способом вывести значение дискриптора?
0
|
15 / 15 / 8
Регистрация: 01.10.2017
Сообщений: 97
|
|
02.10.2017, 12:52 | 20 |
как вариант версию windows можно получить из ветки реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
0
|
02.10.2017, 12:52 | |
02.10.2017, 12:52 | |
Помогаю со студенческими работами здесь
20
Получение html-версии электронного письма Получение версии BIOS-а без использования WMI Получение DLL в Fortran, из более старой его версии Восстановление Windows на компьютере, на котором установлены две версии Windows 10 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |