Windows api windows version

GetVersionExW function (sysinfoapi.h)

[GetVersionEx may be altered or unavailable for releases after WindowsВ 8.1. Instead, use the Version Helper functions]

With the release of WindowsВ 8.1, the behavior of the GetVersionEx API has changed in the value it will return for the operating system version. The value returned by the GetVersionEx 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, GetVersionEx 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.

Syntax

Parameters

An OSVERSIONINFO or OSVERSIONINFOEX structure that receives the operating system information.

Before calling the GetVersionEx function, set the dwOSVersionInfoSize member of the structure as appropriate to indicate which data structure is being passed to this function.

Return value

If the function succeeds, the return value is a nonzero value.

If the function fails, the return value is zero. To get extended error information, call GetLastError. The function fails if you specify an invalid value for the dwOSVersionInfoSize member of the OSVERSIONINFO or OSVERSIONINFOEX structure.

Remarks

Identifying the current operating system is usually not the best way to determine whether a particular operating system feature is present. This is because the operating system may have had new features added in a redistributable DLL. Rather than using GetVersionEx to determine the operating system platform or version number, test for the presence of the feature itself. For more information, see Operating System Version.

The GetSystemMetrics function provides additional information about the current operating system.

Product Setting
Windows XP Media Center Edition SM_MEDIACENTER
WindowsВ XP Starter Edition SM_STARTER
Windows XP Tablet PC Edition SM_TABLETPC
Windows ServerВ 2003В R2 SM_SERVERR2

В

To check for specific operating systems or operating system features, use the IsOS function. The GetProductInfo function retrieves the product type.

To retrieve information for the operating system on a remote computer, use the NetWkstaGetInfo function, the Win32_OperatingSystem WMI class, or the OperatingSystem property of the IADsComputer interface.

To compare the current system version to a required version, use the VerifyVersionInfo function instead of using GetVersionEx to perform the comparison yourself.

If compatibility mode is in effect, the GetVersionEx function reports the operating system as it identifies itself, which may not be the operating system that is installed. For example, if compatibility mode is in effect, GetVersionEx reports the operating system that is selected for application compatibility.

Examples

When using the GetVersionEx function to determine whether your application is running on a particular version of the operating system, check for version numbers that are greater than or equal to the desired version numbers. This ensures that the test succeeds for later versions of the operating system. For example, if your application requires Windows XP or later, use the following test.

For an example that identifies the current operating system, see Getting the System Version.

Читайте также:  Генератор серийного номера windows

The sysinfoapi.h header defines GetVersionEx as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant. Mixing usage of the encoding-neutral alias with code that not encoding-neutral can lead to mismatches that result in compilation or runtime errors. For more information, see Conventions for Function Prototypes.

Getting OS build version from Win32 Api C++

I am trying to find the build version of Windows Server 2016 machines, for example RS1 or RS3. There was an API to do this — GetVersionEx() — but is now deprecated.

MSDN says to use Version Helper Functions instead.

I want the build version, for ex: 1607 for RS1.

Is there an API to get this?

1 Answer 1

Option 0: (per RbMm) Use [RtlGetVersion] from the driver development kit.

Option 1: [Updated] Grab the version number of a system DLL like kernel32.dll. MSDN used to bless this approach, saying:

To obtain the full version number for the operating system, call the GetFileVersionInfo function on one of the system DLLs, such as Kernel32.dll, then call VerQueryValue to obtain the \StringFileInfo\\ProductVersion subblock of the file version information. [From an Internet Archive snapshot of MSDN circa 2017]

That would look something like this:

Note that the original MSDN link now redirects to a newer documentation set that doesn’t mention this approach. I suppose that means this is no longer a supported technique, and, presumably, all the compatibility hacks for older code might prevent an application from getting the actual answer.

Option 2: Query the registry, specifically:

which has values for CurrentMajorVersionNumber , CurrentMinorVersionNumber , and CurrentBuildNumber .

I can’t find official documentation for these values, so this may not be MSDN-approved or future-proof.

Option 3: Use GetProductInfo if available and fall back to GetVersionInfo if it’s not.

Что такое Windows API

Интерфейс прикладного программирования WindowsAPI (applicationprogramminginterface) является интерфейсом системного программирования в пользовательском режиме для семейства операционных систем Windows. До выхода 64-разрядных версий Windows программный интерфейс для 32-разрядных версий операционных систем Windows назывался Win32 API, чтобы его можно было отличить от исходной 16-разрядной версии Windows API (которая служила интерфейсом программирования для начальных 16-разрядных версий Windows).

Windows API состоит из нескольких тысяч вызываемых функций, которые разбиты на следующие основные категории:

  • Базовыеслужбы (Base Services).
  • Службыкомпонентов (Component Services).
  • Службы пользовательского интерфейса (User Interface Services).
  • Графические и мультимедийные службы (Graphics and Multimedia Services).
  • Обмен сообщениями и совместная работа (Messaging and Collaboration).
  • Сеть (Networking).
  • Веб-службы (Web Services).

Описание WindowsAPI можно найти в документации по набору инструментальных средств разработки программного обеспечения — WindowsSoftwareDevelopmentKit (SDK). Эта документация доступна на веб-сайте www.msdn.microsoft.com. Она также включена со всеми уровнями подписки в сеть MicrosoftDeveloperNetwork (MSDN), предназначенную для разработчиков.

Технология .NET.

Microsoft .NET Framework состоит из библиотеки классов под названием Framework Class Library (FCL) и управляемой среды выполнения кода —Common Language Runtime (CLR). CLR обладает функциями своевременной компиляции, проверки типов, сборки мусора и обеспечения безопасности доступа к коду. Предлагая эти функции, CLR предоставляет среду разработки, повышающую производительность работы программистов и сокращающую количество наиболее распространенных ошибок программирования.

Среда CLR реализована, как классический COM-сервер, код которого находится в стандартной Windows DLL-библиотеке, предназначенной для работы в пользовательском режиме. Фактически все компоненты .NET Framework реализованы как стандартные Windows DLL-библиотеки пользовательского режима, наложенные поверх неуправляемых функций Windows API. (Ни один из компонентов .NET Framework не работает в режиме ядра.) Взаимоотношения между этими компонентами показаны на рисунке.

Читайте также:  Как зовут создателя операционной системы linux

Службы, функции и стандартные программы.

Некоторые термины в пользовательской и программной документации Windows в разных контекстах имеют разные значения. Например, слово служба может относиться к вызываемой в операционной системе стандартной подпрограмме, драйверу устройства или к обслуживающему процессу. Что именно означают те или иные термины, показано в следующем списке:

  • Функции Windows API. Документированные, вызываемые подпрограммы в WindowsAPI. Например, CreateProcess, CreateFile и GetMessage.
  • Собственные системные службы (или системные вызовы). Недокументированные базовые службы в операционной системе, вызываемые при работе в пользовательском режиме. Например, NtCreateUserProcess является внутренней службой, которую функция Windows CreateProcess вызывает для создания нового процесса.
  • Функции поддержки ядра (или подпрограммы). Подпрограммы внутри операционной системы Windows, которые могут быть вызваны только из режима ядра. Например, ExAllocatePoolWithTag является подпрограммой, вызываемой драйверами устройств для выделения памяти из системных динамически распределяемых областей Windows (называемых пулами).
  • Службы Windows. Процессы, запускаемые Диспетчером управления службами (Windowsservicecontrolmanager). Например, служба Диспетчер задач запускается в виде процесса, работающего в пользовательском режиме, в котором поддерживается команда at (аналогичная UNIX-командам at или cron).
  • Библиотеки DLL (dynamic-link libraries — динамически подключаемые библиотеки). Набор вызываемых подпрограмм, связанных вместе в виде двоичного файла, который может быть загружен в динамическом режиме приложениями, которые используют эти подпрограммы. В качестве примера можно привести Msvcrt.dll (библиотеку времени выполнения для приложений, написанных на языке C) и Kernel32.dll (одну из библиотек подсистемы Windows API). DLL-библиотеки широко используются компонентами и приложениями Windows, которые работают в пользовательском режиме. Преимущество, предоставляемое DLL-библиотеками по сравнению со статическими библиотеками, заключается в том, что они могут использоваться сразу несколькими приложениями, и Windows обеспечивает наличие в памяти только одной копии кода DLL-библиотеки для тех приложений, в которых имеются ссылки на эту библиотеку. Следует заметить, что неисполняемые .NET-сборки компилируются как DLL-библиотеки, но без каких-либо экспортируемых подпрограмм. CLR анализирует скомпилированные метаданные для доступа к соответствующим типам и элементам классов.

История Win32 API.

Интересно, что Win32 не планировался в качестве исходного интерфейса программирования для той системы, которая в ту пору называлась Windows NT. Поскольку проект Windows NT запускался в качестве замены для OS/2 версии 2, первоначальным интерфейсом программирования был 32-разрядный OS/2 PresentationManagerAPI. Но через год после запуска проекта произошел взлет поступившей в продажу Microsoft Windows 3.0. В результате этого Microsoft сменила направление и сделала Windows NT будущей заменой семейства продуктов Windows, а не заменой OS/2. В связи с этим и возникла необходимость выработать спецификацию Windows API — до этого, в Windows 3.0, API существовал только в виде 16-разрядного интерфейса.

Хотя в Windows API намечалось введение множества новых функций, недоступных в Windows 3.1, Microsoft решила сделать новый API, по возможности, максимально совместимым по именам, семантике и используемым типам данных с 16-разрядным Windows API, чтобы облегчить бремя переноса существующих 16-разрядных Windows-приложений в Windows NT. Этим, собственно, и объясняется тот факт, что многие имена функций и интерфейсов могут показаться непоследовательными: так нужно было для обеспечения совместимости нового Windows API со старым 16-разрядным Windows API.

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

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

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

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

Читайте также:  Windows 10 максимально облегченная сборка

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

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

Получение версии файла
Подскажите, пожалуйста, как в 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.

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