Вопрос обнаружения операционной системы Windows 11 с использованием Delphi 10.3.3 может быть непростой задачей из-за изменений, внесенных Microsoft в систему идентификации версий. Разработчики, привыкшие использовать функцию TOSVersion.ToString, столкнулись с тем, что даже на Windows 11, функция возвращает информацию о Windows 10.
Проблема
Разработчики, использующие функцию TOSVersion.ToString для определения версии Windows, столкнулись с тем, что при работе с Windows 11, функция продолжает отображать версию Windows 10, несмотря на то, что номер сборки превышает 21996. Это связано с тем, что Microsoft скрывает информацию о версии в новых версиях операционной системы, что затрудняет стандартные методы определения версии.
Решение
Для решения этой проблемы можно использовать несколько подходов:
Проверка версии файла: Можно проверить версию файлов, таких как ntoskrnl.exe или explorer.exe, используя функции GetFileVersionInfo() и VerQueryValue(). Если старший 16-битный сегмент номера файловой версии (HiWord(dwFileVersionLS)) больше или равен 22000, это может указывать на Windows 11.
Проверка реестра: В реестре Windows под ключом HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ хранятся значения CurrentBuild и CurrentBuildNumber. Проверка этих значений на большее или равное 22000 может быть признаком Windows 11.
Использование WMI: С помощью класса Win32_OperatingSystem и свойства Caption можно попытаться определить версию операционной системы по строковому описанию.
Проверка доступности API: Некоторые функции были введены только в определенных версиях Windows, и если определенная функция недоступна, это может указывать на то, что система ниже требуемой версии.
Проверка версии Kernel32.dll: Если основная версия равна 10, а номер сборки больше или равен 22000, это может указывать на Windows 11.
Пример кода на Object Pascal (Delphi)
uses
System.SysUtils,
System.Diagnostics,
System.Winapi;
function IsWindows11: Boolean;
var
FileVersionInfo: TFileVersionInfo;
FileVersionData: array[0] of Byte;
FileVersionString: string;
FileVersionOS: DWORD;
begin
Result := False;
// Путь к файлу, например, System32\kernel32.dll
if GetFileVersionInfo(PChar('C:\Windows\System32\kernel32.dll'), 0, SizeOf(FileVersionData), @FileVersionData) then
begin
if VerQueryValue(@FileVersionData[0], '\', FileVersionData[0], SizeOf(FileVersionString)) then
begin
FileVersionString := PChar(FileVersionData[0]);
// Парсинг строки для получения основной версии и номера сборки
// Проверка на Windows 11
end;
end;
end;
Заключение
Для надежного обнаружения Windows 11 в приложениях, написанных на Delphi 10.3.3, разработчикам следует использовать комбинацию методов, описанных выше. Важно понимать, что каждый из этих методов имеет свои ограничения и может потребовать дополнительной проверки и адаптации под конкретные требования приложения.
Разработчики столкнулись с проблемой определения операционной системы Windows 11 в Delphi 10.3.3 из-за изменений в системе идентификации версий, внесенных Microsoft, и ищут эффективные решения для корректного обнаружения версии ОС.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.