Вопрос, заданный пользователем, заключается в некорректной работе функции TOSVersion.Name из модуля SysUtils в среде разработки Delphi при запуске приложения на Windows 10. Пользователь столкнулся с проблемой, что функция возвращает версию Windows 8, несмотря на то, что используется Windows 10. Это происходит, потому что используемый инструментарий (RTS, на котором основан TOSVersion) не имеет информации о Windows 10, так как был создан до её выпуска.
Подтвержденный ответ:
Используемый в приложении инструментарий (RTS) не знает о существовании Windows 10, так как его версия предшествует данной операционной системе.
Приложение не анонсирует в своём манифесте поддержку Windows 10, что приводит к тому, что функция GetVersionEx, на которой основан TOSVersion, возвращает некорректные данные.
Обновление до 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>
Для корректной работы с Windows 10 в приложениях на Delphi необходимо обновить инструментарий и/или использовать альтернативные методы определения версии операционной системы, такие как WMI запросы или добавление в манифест приложения информации о поддерживаемых операционных системах.
Пользователь столкнулся с проблемой, когда функция для определения версии Windows в приложении на Delphi некорректно распознает Windows 10 как Windows 8, из-за чего необходимо обновить используемые модули или воспользоваться альтернативными методами опре
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.