2012-04-15 5 views
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プラットフォームに興味があります。

+1

[Internal_Data_Formats](http://docwiki.embarcadero.com/RADStudio/ja/Internal_Data_Formats)を参照してください。何か変更があるように見えません。 –

+0

@LU RD:* Equals/GetHashCode/ToString *のポインタスロットは存在しません。それらは、先祖クラス* <=>の '親 '(オフセット-36)とSafecallExceptionメソッドのエントリポイントへのポインタ* <=>' SafeCallException'(オフセット-34)へのポインタへの*ポインタの間に置かなければなりません。むしろDelphi 2007 VMTを記述しているようです。 – menjaraz

+0

はい、私はそれを今見ます。ドキュメントは常に最新のものではありませんが、プログラマは次のようにする必要があります。 –

答えて

3

XE2のSystem.pasのクイックレビューでは、VMTの順序と内容に違いはありません。 vmt*の値の異なるオフセットには{$IFDEF CPUX64}がありますが、順序と種類は同じようです。あなたは???でマークした分野では全く新しいことはありません

関連する問題