Win api версия windows

Определение версии Windows 10

Моя цель состоит в том, чтобы обнаружить Windows 10 в моем коде, который должен работать кроссплатформенно, а также в разных версиях Windows (по крайней мере 7 & вверх). Windows предоставляет IsWindows10OrGreater() Чтобы решить эту проблему, но есть еще одна проблема, эта функция отсутствует в предыдущих версиях Windows.

Вы найдете бесчисленные блоги и ТАК вопросы по этому вопросу, а также явное безумие, где такие функции, как getversion и другие, возвращают какую-то другую версию, а не правильную.

Например на моей машине — метод IsWindows10OrGreater() не компилируется (я бы установил Win10 SDK), и IsWindowsVersionOrGreater() отчеты 6 в качестве основной версии.

Так есть ли здравый многоверсионный способ, которым я мог бы решить эту проблему?

Решение

Самый простой способ узнать истинную версию ОС — позвонить RtlGetVersion . Это то, что GetVersionEx а также VerifyVersionInfo звоните, но не используйте совместимые прокладки.

Вы можете использовать DDK ( и связывание с NtosKrnl.lib из режима ядра или ntdll.lib из пользовательского режима) или использование динамического связывания во время выполнения, как в следующем фрагменте:

Если вам нужна дополнительная информация, вы можете передать RTL_OSVERSIONINFOEXW структура вместо RTL_OSVERSIONINFOW структура (правильно назначая dwOSVersionInfoSize членом).

Это возвращает ожидаемый результат в Windows 10, даже если нет прикрепленного манифеста.

Кроме того, общепринятым считается лучшее решение для предоставления различных реализаций на основе доступных функции а не версии ОС.

Другие решения

IsWindows10OrGreater() от VersionHelpers.h

файл VersionHelpers.h поставляется с Windows 10 SDK, но также будет работать и в предыдущих версиях. Просто скопируйте его в свою среду разработки.

Это просто небольшая библиотека, определенная только для заголовка, которая использует VerSetConditionMask а также VerifyVersionInfoW функции, обе доступны в WinAPI начиная с Windows 2000.

Upd Если вы не можете включить файл манифеста с вашим исходным кодом, вы можете использовать простой взлом: просто получите версию любой системной DLL, например, kernel32.dll с помощью GetFileVersionInfo функция.

Вы можете прочитать реальный номер сборки из реестра, а затем вывести из него версию Windows. Ваше приложение не должно иметь манифест для этой работы: на моей машине оно правильно определяет номер сборки ОС как 10586. Например:

GetVersion function (sysinfoapi.h)

GetVersion may be altered or unavailable for releases after WindowsВ 8.1. Instead, use the Version Helper functions. For Windows 10 apps, please see Targeting your applications for Windows.

With the release of WindowsВ 8.1, the behavior of the GetVersion API has changed in the value it will return for the operating system version. The value returned by the GetVersion function now depends on how the application is manifested.

Applications not manifested for WindowsВ 8.1 or WindowsВ 10 will return the WindowsВ 8 OS version value (6.2). Once an application is manifested for a given operating system version, GetVersion will always return the version that the application is manifested for in future releases. To manifest your applications for WindowsВ 8.1 or WindowsВ 10, refer to Targeting your application for Windows.

Читайте также:  Как изменить качество звука windows

Syntax

Parameters

This function has no parameters.

Return value

If the function succeeds, the return value includes the major and minor version numbers of the operating system in the low-order word, and information about the operating system platform in the high-order word.

For all platforms, the low-order word contains the version number of the operating system. The low-order byte of this word specifies the major version number, in hexadecimal notation. The high-order byte specifies the minor version (revision) number, in hexadecimal notation. The high-order bit is zero, the next 7 bits represent the build number, and the low-order byte is 5.

Remarks

The GetVersionEx function was developed because many existing applications err when examining the packed DWORD value returned by GetVersion, transposing the major and minor version numbers. GetVersionEx forces applications to explicitly examine each element of version information. VerifyVersionInfo eliminates further potential for error by comparing the required system version with the current system version for you.

Examples

The following code fragment illustrates how to extract information from the GetVersion return value: OSVERSIONINFOEX

Получение версии Windows

Здравствуйте, дорогие форумчане! Столкнулся со следующей проблемой. Есть код, который с помощью системной библиотеки определяет версию Windows. Вот он:

При выполнении функции возникает исключение:

Вызвано исключение по адресу 0x766A2410 (user32.dll) в WindowsProject1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x000016C6.

Не знаю как исправить. Надеюсь на Вашу помощь.

Есть ли какие — то ограничения по минимальной версии Windows / Linux для последней версии Qt?
Привет! Вот тут какие — то непонятки. Скачал Qt последний на Win7 — ворк пёрфеткли, на 8.1 — та же.

Получение версии файла
Подскажите, пожалуйста, как в C# получить версию exe файла?

Получение сведений о версии ОС
Здравствуйте! Спортивный интерес. Как тоже самое переписать для юникодной версии функции ? .

Резервное получение версии программы
Я написал программу. При запуске она сверяет свою версию с версией на веб-сервере. Дело в том что.

ForceGuard, спасибо)
А можете подсказать что-нибудь по этому вопросу?

Как таким же способом, как ниже, вывести значение дискриптора файла?

Как только не пробовал явно преобразовать тип дискриптора, результат — компилятор не ругается только на преобразование — (char)переменная со значением дискриптора, но в listbox выводится только «`»

Добавлено через 2 минуты
Убежденный, а можете подсказать что-нибудь по этому вопросу?

Как таким же способом, как ниже, вывести значение дискриптора файла?

Получение версии Windows

Здравствуйте, дорогие форумчане! Столкнулся со следующей проблемой. Есть код, который с помощью системной библиотеки определяет версию Windows. Вот он:

При выполнении функции возникает исключение:

Вызвано исключение по адресу 0x766A2410 (user32.dll) в WindowsProject1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x000016C6.

Не знаю как исправить. Надеюсь на Вашу помощь.

Есть ли какие — то ограничения по минимальной версии Windows / Linux для последней версии Qt?
Привет! Вот тут какие — то непонятки. Скачал Qt последний на Win7 — ворк пёрфеткли, на 8.1 — та же.

Читайте также:  Чем записывать iso mac os

Получение версии файла
Подскажите, пожалуйста, как в C# получить версию exe файла?

Получение сведений о версии ОС
Здравствуйте! Спортивный интерес. Как тоже самое переписать для юникодной версии функции ? .

Резервное получение версии программы
Я написал программу. При запуске она сверяет свою версию с версией на веб-сервере. Дело в том что.

— так объединять строки нельзя, используйте или _tcscat или std::basic_string

Добавлено через 9 минут

Operok, спасибо, исправлю, не знал. Что возвращает функция — проверю ещё раз и напишу!)

Добавлено через 1 минуту
Убежденный, функция не устраивает тем, что она возвращает одни и тоже значения для всех операционных систем, начиная с Windows 8.

Тут как-то уже писали, что GetVersion(Ex) и RtlGetVersion — это, по сути, одно и то же.
И «неправильные» номера будут в обоих вариантах. Если уж на то пошло, тогда
брать номер версии следует из RtlGetNtVersionNumbers или читать из PEB.

Про манифесты есть здесь (особенно нижнюю ссылку, там есть пример манифеста с
блоком ‘compatibility’ для Windows 10).

Убежденный, хорошо, буду пробовать)

Добавлено через 5 часов 21 минуту
Убежденный, отключил создание манифеста в свойствах. Создал файл манифеста аналогично Вашему и подключил его. Теперь на этапе компиляции возникает ошибка, связанная с файлом манифеста.

Добавлено через 10 минут
Убежденный, исправил, пересобрав проект

Добавлено через 3 часа 13 минут

в какой они библиотеке находятся?

Добавлено через 16 минут

Добавлено через 2 минуты

Да, это уже нашёл, а вот последнюю ошибку не знаю как исправить.

Добавлено через 37 секунд

Сейчас попробую, спасибо!

Добавлено через 2 минуты
Operok,

Невозможно преобразовать version в (LPARAM)

Добавлено через 1 минуту

Передавать по ссылке?

Добавлено через 3 минуты

Operok, видимо, потому что до конца ещё не разобрался)
Спасибо, буду пробовать)

Добавлено через 12 часов 52 минуты
Operok, не работает вывод. Вместо windows и . просто квадраты выводятся

Добавлено через 1 минуту
Operok, использую:

Тем, что она с рандомным шансом на Win 8.1 / 10 на некоторых системах может вернуть версию 6.2 (т.е. Windows 8) даже при наличии манифеста совместимости. При чём может выдавать каждый раз разную версию для одной и той же машины.
Пруф — логи моих программ на VB6 с одного из ПК юзеров (на AutoIt, кстати, тоже). Я конечно не исключаю, что виртуализация через VB6 рантайм или особые опции линковщика накладывают какие-то свои искажения. В программе честный вызов обеих функций через отложенную загрузку dll (см. GetVersion.exe). При том, что GetVersionEx у меня работала исправно на 99% машин.

Если есть желание, можешь собрать тестовую утилиту (желательно с сурцами). У меня остался на примете активный юзер с Win10, у которого воспроизводилась эта проблема. Могу попытаться попросить его протестировать.

P.S. Кстати, на его тестах (на моих тоже) RtlGetVersion нормально отрабатывает и без манифеста совместимости.

Как то не хочется экспериментировать в своей программе с непроверенной инфой (хотя, если хочешь, можешь и такой тест написать). Просто RtlGetVersion как-бы «рекомендует» Майкрософт, ведь:

и если погуглить то можно найти сурцы этих макросов, которые раскрываются именно через функцию RtlGetVersion.

Разбираемся в WinAPI

Для кого эта статья

Эта статья адресована таким же, как и я новичкам в программировании на С++ которые по воле случая или по желанию решили изучать WinAPI.
Хочу сразу предупредить:
Я не претендую на звание гуру по C++ или WinAPI.
Я только учусь и хочу привести здесь несколько примеров и советов которые облегчают мне изучение функций и механизмов WinAPI.

Читайте также:  Самый лучший дистрибутив linux для программистов

В данной статье я предполагаю что вы уже достаточно ознакомились с С++, что бы уметь создавать классы и перегружать для них различные операторы и что вы уже «прятали» какие-то свои механизмы в класс.

Создание и использование консоли

Для отладки Win32 приложения или просто для того что посмотреть как оно там всё внутри происходит я всегда пользуюсь консолью.
Так как вы создаете GUI приложение, а не консольное, то консоль не подключается. Для того что бы её вызвать в недрах интернета был найден вот этот код

if (AllocConsole())
<
int hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 4);
*stdout = *(::_fdopen(hCrt, «w»));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(hCrt, «w»));
::setvbuf(stderr, NULL, _IONBF, 0);
std::ios::sync_with_stdio();
>
Для удобства советую обернуть его в функцию. Например:
void CreateConsole()
<
if (AllocConsole())
<
int hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 4);
*stdout = *(::_fdopen(hCrt, «w»));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(hCrt, «w»));
::setvbuf(stderr, NULL, _IONBF, 0);
std::ios::sync_with_stdio();
>

Вызванная консоль работает только в режиме вывода и работает он также как и в консольных приложениях. Выводите информацию как и обычно — cout/wcout.
Для работоспособности данного кода необходимо включить в прект следующие файлы:
#include
#include #include
и включить пространство имен std в глобальное пространство имён:
using namespace std;
Конечно же, если вы не хотите этого делать, то просто допишите std:: ко всем сущностям которые в ней находятся.

Наследование объектов для вывода и арифм. операций

При создании и изучении самих «окошек» мне всегда требовалось выводить в консоль какое-нибудь значение.
Например:
Вы получаете размер клиентской области окна с помощью функции GetClientRect куда как параметр передается адрес объекта структуры RECT, что бы заполнить этот объект данными. Если вам нужно узнать размер полученной клиентский области вы просто можете вывести его в уже подключённую консоль

Но делать так каждый раз (особенно если вам часто приходиться делать что-то подобное) очень неудобно.
Здесь нам на помощь приходит наследование.
Создайте класс который открыто наследуется от структуры RECT и перегрузите оператор вывода class newrect:public RECT
<
public:
friend ostream& operator

Теперь просто выводите обьект с помощью cout/wcout:

И вам в удобном виде будет выводиться всё так, как вам требуется.
Так же вы можете сделать с любыми нужными вам операторами.
Например, если надо сравнивать или присваивать структуры (допустим тот же RECT или POINT) — перегрузите operator==() и operator=() соответственно.
Если хотите реализовать оператор меньше class BaseWindow
<
WNDCLASSEX _wcex;
TCHAR _className[30];
TCHAR _windowName[40];
HWND _hwnd;
bool _WindowCreation();
public:
BaseWindow(LPCTSTR windowName,HINSTANCE hInstance,DWORD style,UINT x,UINT y,UINT height,UINT width);
BaseWIndow(LPCTSTR windowName,HINSTANCE hInstance);
const HWND GetHWND()const
LPCTSTR GetWndName()const
>;

Один раз хорошенько продумав и написав такой класс вы облегчите себе жизнь и будете больше времени уделять обучению и оттачиванию навыков чем написанию одного и того же каждый раз. Тем более, я считаю это очень полезно — самому сделать такой класс и дополнять его по необходимости.

Оцените статью