Не совсем понимаю, что происходит, но когда вы посмотрите, например, IsPublishedProp
в блоке TypInfo
, вы увидите, что он вызывает ClassInfo экземпляра как указатель на TypeInfoструктура:
PTypeInfo(Instance.ClassInfo)
Когда вы смотрите на метод ClassInfo, он возвращает простой указатель, значение которого кажется связанным с таблицей vmt:
Result := PPointer(Integer(Self) + vmtTypeInfo)^;
vmtTypeInfo
имеет значение-72.Четыре байта до этого в -76 равны vmtInitTable
.За vmtTypeInfo следуют FieldTable, MethodTable, DynamicTable и т. д.
значение vmtInitTable используется, например, в TObject.CleanupInstance
и передается _FinalizeRecord
в качестве указателя на структуру TypeInfo.
Так чточетыре байта до того, как структура TypeInfo, указывающая на структуру TypeInfo, по-видимому, находится там по замыслу и части структуры vmt.
Edit
Как Мейсон справедливо указал вышеэто полная красная сельдь (см. комментарии).Я оставляю ответ, чтобы другим не пришлось его искать.
Обновление Чтобы избежать путаницы с переменными и их адресами, я переписал процедуру теста Мейсона следующим образом:
procedure test(info: PTypeInfo);
begin
writeln('value of info : ', cardinal(info));
writeln('info - 4 : ', cardinal(info) - 4);
writeln('value 4 bytes before: ', cardinal(PPointer(cardinal(info)-4)^));
end;
и позвоните ему со следующей информацией:
procedure TryRTTIStuff;
begin
writeln('TPersistent');
test(TypeInfo(TPersistent));
writeln('TTypeKind enumeration');
test(TypeInfo(TTypeKind));
writeln('Integer');
test(TypeInfo(Integer));
writeln('Nonsense');
test(PTypeInfo($420000));
end;
Первые три дают результаты, которые описывает Мейсон.Я только добавил дополнительную запись, чтобы показать значение указателя для последней записи.Последний вызов в TryRTTIStuff должен показать, что если вы не передадите указатель на действительную структуру TypeInfo, вы не получите одно и то же значение в первой и третьей записи для вызова.
Пока нет подсказки, посколькук тому, что происходит с TypeInfo.Может быть, нам следует спросить Барри Келли, поскольку он является автором нового RTTI D2010, поэтому тоже должен многое знать о старом ...