Как определить Windows 11 с помощью Delphi 10.3.3

Я использую функцию TOSVersion.ToString (использует SysUtils) для определения версии Windows. Однако вот что я получаю в Windows11:

Windows 10 (Version 10.0, Build 21996, 64-bit Edition)

Есть ли надежный способ обнаружить Windows 11? Я использую Delphi 10.3.3.

4 ответа

Как заметил Реми: используя WinAPI, вы рискуете оказаться в каком-то .

  1. Одна из альтернатив - проверить версию файла ожидаемых файлов, т. Е.

    • %windir%\system32\ntoskrnl.exe или
    • %windir%\explorer.exe

    с использованием GetFileVersionInfo() а также VerQueryValue() - в HiWord(dwFileVersionLS)должно быть или выше (в соответствии с номером сборки / выпуска Windows NT ).

  2. Другой - посмотреть в реестре под HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\при текстовых значениях CurrentBuild а также CurrentBuildNumber, проверяя, является ли наивысшее из обоих 22000 или выше.

  3. Дэвид уже написал подробный ответ в разделе « режиме совместимости, в результате чего сообщаемая версия будет ниже фактическойПроверка версии Windows на W10» с еще большим количеством альтернатив, хотя сконцентрировался на высоких / низких номерах версий, а не на сборке. Но WMI может помочь .

  4. (Это работает только ретроспективно с подтвержденными знаниями.) Проверьте, какие экспортные API доступны: идея состоит в том, что определенные функции были введены в определенных выпусках / версиях Windows, поэтому, если импорт не удастся для одного, вы знаете, что используете версию ниже. Устаревший пример и устаревший список минимальных версий на функцию даст вам идею. Теперь вам «только» нужно выяснить, какие новые функции представлены в Windows 11.

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

Официальный основной номер версии для Windows 11 — 10.

Официальный номер сборки общедоступной предварительной версии Windows 11 — 10.0.22000.168.

Более ранние сборки:

  • 10.0.22000.71
  • 10.0.22000.65
  • 10.0.22000.51

Часто задаваемые вопросы по Microsoft Windows 11

Если вы хотите обнаружить предварительные версии, самый ранний номер сборки был 10.0.22000.51 . История версий Windows 11.

полагается на некоторые жестко закодированные имена и логику для возврата имени ОС. Вам придется реализовать собственное обнаружение, скопировать и изменить TOSVersionзапишите или создайте обертку вокруг него, где вы можете использовать существующую логику для более старых версий и реализовать проверку на основе номера сборки Windows 11 для обнаружения Windows 11.

Для других общих вопросов и подходов к определению версии ОС вы можете обратиться к ответу AmigoJack.

За исключением очень слабого, по крайней мере для меня, решения рассматривать сборки Windows 10 выше 22000, такие как Windows 11, единственное решение, которое я нашел, которое действительно работает, — это WMIs Win32_OperatingSystem class - Captionимущество.

На моей машине dev Win10 он дает следующую строку: Microsoft Windows 10 Pro.

На моей другой машине разработчика с установленной Win11 та же функция дает: Microsoft Windows 11 Pro.

Разница заключается в строковых значениях — «10» против «11», но это, по крайней мере, намного лучше, чем решение «создать больше, чем».

C# и C++ работают хорошо.

Самый простой способ — получить версию Kernel32.dll, и если основная версия равна 10, а версия сборки >= 22000, то у вас Windows 11.

См. мой код здесь: Как найти название продукта Windows в Windows 11?

Другие вопросы по тегам