Вопрос по windows, winapi, windows-8.1, visual-studio-2013, minimumosversion – Как получить версию ОС в Win8.1, так как GetVersion / GetVersionEx устарели?

6

У меня есть сценарии, в которых я хочу конкретно знать основную / вспомогательную версию ОС, номер сборки и т. Д.

Начиная с Windows 8.1GetVersion а такжеGetVersionEx были объявлены устаревшими, заявив:

[GetVersion/GetVersionEx может быть изменено или недоступно для выпусков после Windows 8.1. Вместо этого используйте функции помощника по версии]

Ни один изAPI помощника по версии помогите мне получить номер версии ОС, скорее помогите мне проверить или узнать, является ли моя версия такой же или выше упомянутой версии. Что можно сделать?

Есть класс Win32_OperatingSystem WMI Alex K.
Какой у вас сценарий? Также смэтот поток переполнения стека. Chuck Walbourn
То, что говорит @Alex, хорошо. Вы всегда можете прочитать версию ресурса из kernel32. David Heffernan
@AlexK. Я думаю, что вы должны добавить его в качестве ответа на этот вопрос, потому что ни один из ответов не говорил о запросе WMI Ram
Я еще никогда не знал, чтобы Microsoft удалила функцию API, даже если она устарела, поэтому я бы сказал, что продолжайте использовать ее, если хотите. Просто имейте в виду, что в более поздних версиях Windows речь идет о номере версии, если в вашем манифесте не указана совместимость с текущей версией. Jonathan Potter

Ваш Ответ

3   ответа
4

APIGetVersionEx () продолжает работать в Windows 8.1+, но Microsoft изменила свою функциональность. Из MSDN (акцент мой):

С выпуском Windows 8.1 поведение API GetVersionEx изменилось в значении, которое будет возвращено для версии операционной системы. Значение, возвращаемое функцией GetVersionEx сейчасзависит от того, как приложение проявляется.

Приложения, не представленные для Windows 8.1, вернут значение версии ОС Windows 8 (6.2). Как только приложение будет показано для данной версии операционной системы, GetVersionEx всегда будет возвращать версию, для которой приложение будет отображаться в будущих выпусках. Чтобы манифестировать ваши приложения для Windows 8.1, пожалуйста, обратитесь к разделу Ориентация вашего приложения для Windows 8.1

Что вам нужно сделать, это добавить надлежащие GUID в двоичные файлы вашего приложения (.exe / .dll) (через XML-информацию манифеста). Другими словами,если вы специально заявите, что ваше приложение поддерживает 8.1, GetVersionEx () вернет правильную информацию при работе на Windows 8.1. Если вы этого не сделаете, GetVersionEx () будет лгать вам.

УвидетьОриентация вашего приложения на Windows 8.1 для списка GUID. Такжездесь и здесь.

Список GUID для Ленивых

Vista / Server 2008:{e2011457-1546-43c5-a5fe-008deee3d3f0}Windows 7 / Server 2008 R2:{35138b9a-5d96-4fbd-8e2d-a2440225f93a}Windows 8 / Server 2012:{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}Windows 8.1 / Server 2012 R2:{1f676c76-80e1-4239-95bb-83d0f6d0da78}Windows 10 / Server 2016:{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
Что если в моем приложении нет mainfest? Abhishek Jain
Вы можете просто добавить один в настройках вашего проекта. Смотрите, например, здесь:msdn.microsoft.com/en-us/library/ms235229%28v=vs.110%29.aspx NuSkooler
Имейте в виду, что если вы не будете постоянно обновлять свое приложение, в конце концов ваш манифест не будет содержать «последнюю» версию Windows, и вы получите ложную версию. Chuck Walbourn
Для нацеливания на Windows 8.1 необходимо либо включить манифест приложения, либо включить _NT_TARGET_VERSION = $ (_NT_TARGET_VERSION_LATEST) в исходный файл. Вопрос, где поставить включить _NT_TARGET_VERSION? какой исходный файл? Abhishek Jain
Также имейте в виду, что если вы не обновите и не протестируете свое приложение на последних версиях, оно может с большой вероятностью сломаться. Показательный пример: GetVersionEx () перестает функционировать должным образом. Это WAD. NuSkooler
2

Есть новая функция с именемGetProductInfo это возвращает информацию о версии.

Если вы хотите проверить для конкретной версии, вы должны использовать дажеVerifyVersionInfo

Легко создать структуру, чтобы проверить, работает ли конкретная версия ОС. VerifyVersionInfo использует структуры версий, и вы можете легко проверить VER_GREATER_EQUAL и VER_LESS_EQUAL

Также обратите внимание, что GetVersionEx не работает в системе Windows 8.1, если вы правильно указали запись поддерживаемой ОС в разделе совместимости для своего манифеста. Но это может быть в будущей версии ОС!

УвидетьОриентация вашего приложения на Windows 8.1 для списка GUID. Также покрытыВот.

Список GUID для манифеста приложения

Vista:{e2011457-1546-43c5-a5fe-008deee3d3f0}Windows 7:{35138b9a-5d96-4fbd-8e2d-a2440225f93a}Windows 8:{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}Windows 8.1:{1f676c76-80e1-4239-95bb-83d0f6d0da78}Windows 10:{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
GetProductInfo() не возвращает версию ОС. Вы передаете его в нужной версии ОС, и он возвращаетТип продукта ОС (бизнес, предприятие, датацентр и т. д.). Это четко указано вдокументация: "Извлекает тип продукта для операционной системы на локальном компьютере и отображает тип на типы продуктов, поддерживаемые указанной операционной системой." Remy Lebeau
Вы можете получить основной номер пакета обновления с VerifyVersionInfo. Я не знаю ни одной ситуации, когда номер сборки ОС внутри SP отличается ... xMRi
Я хочу получить основной, вспомогательный и номер сборки операционной системы, в которой я запускаю свою программу? Как получить это, используя GetProductInfo и VerifyVersionInfo? Abhishek Jain
-7

Проверьтеэта статья на codeproject.com, Он отлично работает для Windows 8:

1) Скачать.DLL и добавьте его в свой проект.

2) Используйте этот код, чтобы получитьИнформация о операционной системе :

StringBuilder sb = new StringBuilder(String.Empty);
sb.AppendLine("Operation System Information");
sb.AppendLine("----------------------------");
sb.AppendLine(String.Format("Name = {0}", OSVersionInfo.Name));
sb.AppendLine(String.Format("Edition = {0}", OSVersionInfo.Edition));
if (OSVersionInfo.ServicePack!=string.Empty)
sb.AppendLine(String.Format("Service Pack = {0}", OSVersionInfo.ServicePack));
else
sb.AppendLine("Service Pack = None");
sb.AppendLine(String.Format("Version = {0}", OSVersionInfo.VersionString));
sb.AppendLine(String.Format("ProcessorBits = {0}", OSVersionInfo.ProcessorBits));
sb.AppendLine(String.Format("OSBits = {0}", OSVersionInfo.OSBits));
sb.AppendLine(String.Format("ProgramBits = {0}", OSVersionInfo.ProgramBits));

textBox1.Text = sb.ToString();

Похожие вопросы