Вопрос, поднятый пользователем, касается проблемы доступа к свойству типа набор байтов (set of Byte) через RTTI в среде разработки Delphi XE-2. Проблема заключается в том, что при попытке прочитать значение свойства PropSetOfByte типа TTestSetOfByte (который является набором байтов) возникает ошибка доступа EAccessViolation. Это происходит, несмотря на то, что свойства других типов, таких как Integer и String, работают корректно.
Описание проблемы
Пользователь определил тип набора байтов TTestSetOfByte, интерфейс ITestInterface с свойством PropSetOfByte типа TTestSetOfByte, а также класс TTestClass3, реализующий данный интерфейс. В коде класса TTestClass3 присутствуют приватное поле FSetOfByte, а также геттер и сеттер для свойства PropSetOfByte.
Пример кода:
type
TTestSetOfByte = set of Byte;
ITestInterface = interface
['{BCF0CEC2-F999-4E8A-A732-416F343C1629}']
function GetPropSetOfByte: TTestSetOfByte;
procedure SetPropSetOfByte(const Value: TTestSetOfByte);
property PropSetOfByte: TTestSetOfByte read GetPropSetOfByte write SetPropSetOfByte;
end;
TTestClass3 = class(TInterfacedObject, ITestInterface)
private
FSetOfByte: TTestSetOfByte;
function GetPropSetOfByte: TTestSetOfByte;
procedure SetPropSetOfByte(const Value: TTestSetOfByte);
public
constructor Create;
property PropSetOfByte: TTestSetOfByte read GetPropSetOfByte write SetPropSetOfByte;
end;
В тестовом коде, при использовании RTTI для чтения значения свойства PropSetOfByte, происходит ошибка EAccessViolation. Пользователь использует Delphi XE-2.
Подтвержденный ответ
Проблема заключается в том, что функция TRttiType.GetValue() (точнее, функция Invoke() в модуле System.Rtti) пытается вызвать метод GetPropSetOfByte() класса TTestClass3. При этом, указатель на объект (Self) передается корректно, но параметр Result является нулевым, что приводит к ошибке доступа при попытке присвоения значения FSetOfByte в Result внутри метода GetPropSetOfByte().
Коротко говоря, система RTTI неправильно устанавливает стек вызовов для свойств, основанных на типах Set. Пользователь обнаружил эту проблему в версиях Delphi XE2, XE6 и XE7, и сообщил об этом как о ошибке в системе отслеживания ошибок Embarcadero: TRttiProperty.GetValue() crash on Set-based property.
Альтернативный ответ
На момент предоставления информации, проблема не была решена в более поздних версиях Delphi (XE7). Пользователь также выразил интерес к возможным обходным путям, которые могли бы позволить получить значение TValue для свойства.
Рекомендации
На данный момент, учитывая отсутствие исправления в более новых версиях Delphi, пользователям рекомендуется избегать использования свойств на основе типов Set в сочетании с RTTI. В качестве альтернативы можно рассмотреть использование пользовательских типов данных, которые могут быть сериализованы через RTTI без использования встроенных типов Set.
Также, можно ожидать обновлений от Embarcadero, следя за статусом исправления ошибки в системе отслеживания отчетов об ошибках.
Вывод
Проблема доступа к свойствам типа набор байтов через RTTI в Delphi XE-2 связана с некорректной работой системы RTTI при обработке свойств, основанных на типах Set. На данный момент нет исправлений в более новых версиях Delphi, и пользователям рекомендуется избегать использования таких свойств в сочетании с RTTI или использовать альтернативные подходы для работы с данными.
Проблема заключается в ошибке доступа к свойству типа набор байтов через RTTI в Delphi XE-2, вызванной неправильной работой системы RTTI при попытке обращения к свойствам, основанным на типах `Set`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.