Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разбираемся с некорректным определением версии Windows 10 в приложениях на Delphi

Delphi , ОС и Железо , Windows

Вопрос, заданный пользователем, заключается в некорректной работе функции TOSVersion.Name из модуля SysUtils в среде разработки Delphi при запуске приложения на Windows 10. Пользователь столкнулся с проблемой, что функция возвращает версию Windows 8, несмотря на то, что используется Windows 10. Это происходит, потому что используемый инструментарий (RTS, на котором основан TOSVersion) не имеет информации о Windows 10, так как был создан до её выпуска.

Подтвержденный ответ:

  1. Используемый в приложении инструментарий (RTS) не знает о существовании Windows 10, так как его версия предшествует данной операционной системе.
  2. Приложение не анонсирует в своём манифесте поддержку Windows 10, что приводит к тому, что функция GetVersionEx, на которой основан TOSVersion, возвращает некорректные данные.
  3. Обновление до XE8 Update 1 может решить проблему, так как в нём используется функция NetWkstaGetInfo, которая не подвержена описанному выше недочёту, но при этом сама функция может иметь проблемы с утечкой памяти.

Альтернативные способы решения:

  • Добавление в манифест приложения опции supportedOS с указанием GUID для Windows 10, что позволит функции GetVersionEx корректно определять версию операционной системы.
  • Использование WMI запроса для получения информации о версии операционной системы.
  • Вызов функций NetServerGetInfo или NetWkstaGetInfo.
  • Вызов функции RtlGetVersion.

Пример использования WMI запроса:

function OperatingSystemDisplayName: string;
var
  objWMIService: OleVariant;
  colItems: OleVariant;
  Item: OleVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;
begin
  Try
    objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
    colItems := objWMIService.ExecQuery('SELECT Caption, CSDVersion, Version FROM Win32_OperatingSystem', 'WQL', 0);
    oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
    if oEnum.Next(1, Item, iValue) = 0 then begin
      Result := FullVersionString(Item);
      exit;
    end;
  Except
    // Обработка исключений для использования резервного кода
  End;
  // Резервный код, использующий deprecated функцию GetVersionEx
  Result := TOSVersion.ToString;
end;

function GetWMIObject(const objectName: string): IDispatch;
begin
  // Реализация функции GetWMIObject
end;

function VarToString(const Value: OleVariant): string;
begin
  // Реализация функции VarToString
end;

function FullVersionString(const Item: OleVariant): string;
begin
  // Реализация функции FullVersionString
end;

Также можно использовать кастомный манифест, который делает приложение "совместимым" с Windows 10. Пример манифеста:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <!-- Остальная часть манифеста -->
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- Описание поддерживаемых операционных систем -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
      <!-- Другие операционные системы -->
    </application>
  </compatibility>
</assembly>

Этот манифест можно получить по ссылке Targeting your application for Windows.

Заключение:

Для корректной работы с Windows 10 в приложениях на Delphi необходимо обновить инструментарий и/или использовать альтернативные методы определения версии операционной системы, такие как WMI запросы или добавление в манифест приложения информации о поддерживаемых операционных системах.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой, когда функция для определения версии Windows в приложении на Delphi некорректно распознает Windows 10 как Windows 8, из-за чего необходимо обновить используемые модули или воспользоваться альтернативными методами опре


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:44:28/0.0036149024963379/0