不要完全明白是怎麼回事,但是當你在TypInfo
單位看看例如IsPublishedProp
,你會看到它蒙上了實例的ClassInfo作爲一個指向所屬類別結構:
PTypeInfo(Instance.ClassInfo)
當你看的ClassInfo方法,它返回一個簡單的指針,它的價值似乎相關VMT表:
Result := PPointer(Integer(Self) + vmtTypeInfo)^;
vmtTypeInfo
的值爲-72。在-76之前的四個字節是vmtInitTable
。 vmtTypeInfo後面跟着FieldTable,MethodTable,DynamicTable等。
vmtInitTable的值用於例如TObject.CleanupInstance
並作爲指向TypeInfo結構的指針傳遞給_FinalizeRecord
。
因此,指向TypeInfo結構的TypeInfo結構之前的四個字節似乎是由設計和部分vmt結構存在的。
編輯
梅森正確地指出上面是一個完整的紅鯡魚(見註釋)。我正在離開答案,以便其他人不必追究。
更新 爲了避免過度變量及其地址混淆,我重寫了梅森的測試程序如下:
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結構的指針時,您不會在第一個和第三個writeln的調用中獲得相同的值。
還沒有線索尚未與TypeInfo進行。也許我們應該問巴里凱利,因爲他是新的D2010 RTTI的作者,所以應該知道很多關於舊的...
我假設在上面的代碼中缺少'var' ... – 2010-08-09 19:45:34
@Andreas:哪裏?我沒有看到任何遺漏的變種... – 2010-08-09 19:50:34
哎呀!好,現在就修好了。 – 2010-08-09 20:00:57