3
当分の間、Delphi XEは私のボックスでしか利用できません.Delphi 2010/XE2ではいくつかの大きな変更が導入されました。Delphi XE2までアップデートする仮想メソッドの署名を
私は、次の定義を更新するために助けてください:
TVmt = packed record
SelfPtr : TClass;
IntfTable : Pointer;
AutoTable : Pointer;
InitTable : PFieldTable;
TypeInfo : PTypeInfo;
FieldTable : Pointer;
MethodTable : Pointer;
DynamicTable : Pointer;
ClassName : PShortString;
InstanceSize : Cardinal;
Parent : PClass;
{$IFDEF DELPHI2009_UP}
Equals : Pointer;
GetHashCode : Pointer;
ToString : Pointer;
{$ENDIF}
{$IFDEF DELPHIXE_UP}
// ???
{$ENDIF}
{$IFDEF DELPHIXE2_UP}
// ???
{$ENDIF}
SafeCallException : PSafeCallException;
AfterConstruction : PAfterConstruction;
BeforeDestruction : PBeforeDestruction;
Dispatch : PDispatch;
DefaultHandler : PDefaultHandler;
NewInstance : PNewInstance;
FreeInstance : PFreeInstance;
Destroy : PDestroy;
{UserDefinedVirtuals: array of procedure;}
end;
感謝を事前に。
私は必要な情報は、ユニットはSystem.pasからgrabedすることができます。私はそれをDelphi XEのバージョンとしてチェックしていますが、VMTがCPUに依存していることも発見しました(詳細は{$IF defined(CPUX64)}
ディレクティブを参照してください)。
私は32ビットWindowsプラットフォームに興味があります。
[Internal_Data_Formats](http://docwiki.embarcadero.com/RADStudio/ja/Internal_Data_Formats)を参照してください。何か変更があるように見えません。 –
@LU RD:* Equals/GetHashCode/ToString *のポインタスロットは存在しません。それらは、先祖クラス* <=>の '親 '(オフセット-36)とSafecallExceptionメソッドのエントリポイントへのポインタ* <=>' SafeCallException'(オフセット-34)へのポインタへの*ポインタの間に置かなければなりません。むしろDelphi 2007 VMTを記述しているようです。 – menjaraz
はい、私はそれを今見ます。ドキュメントは常に最新のものではありませんが、プログラマは次のようにする必要があります。 –