Il file System.pas contiene una discreta quantità di informazioni sugli offset VMT codificati, ma in realtà non sembra dire molto sulla struttura del VMT stesso. Quello che mi piacerebbe davvero sapere è, c'è un modo per scoprire le dimensioni di un VMT in fase di esecuzione, o in altre parole, quanti metodi virtuali esistono per una data classe?Dove posso trovare informazioni sulla struttura di Delphi VMT?
risposta
Cosa ne pensi della struttura del VMT? Sapete anche che si tratta di un dettaglio di implementazione interno che è soggetto a modifiche (e che è cambiato nel tempo).
Per rispondere alla tua domanda specifica, ecco un modo semplice per trovare il numero di metodi virtuali per una determinata classe:
function GetVirtualMethodCount(AClass: TClass): Integer;
begin
Result := (PInteger(Integer(AClass) + vmtClassName)^ -
(Integer(AClass) + vmtParent) - SizeOf(Pointer)) div SizeOf(Pointer);
end;
Questo funziona perché mi capita di sapere che la stringa che rappresenta il nome della classe è posto seguendo immediatamente tutti i vettori del metodo virtuale nel VMT.
So anche che ci sono 11 metodi virtuali (per D2009, 9 per D2007 e precedenti) su tutti i TObject che sono sfalsati rispetto al puntatore VMT stesso.
Questo è il motivo per il riferimento vmtParent.
Infine, utilizzando un riferimento di classe TClass, è possibile passare qualsiasi classe derivata TObject in questa funzione e ottenere il numero di metodi virtuali.
Googling :-P per "delphi vmt" produce this. Forse questo ti dà un inizio.
* grin * Adoro Hallvard! È bravo a trucchi come questo. Sfortunatamente, definisce i virtual definiti dall'utente come un "array [0..999]", o in altre parole "più grande di quanto avrebbe mai dovuto essere." Sto cercando un modo per trovare la dimensione reale. –
Ricordo che c'erano alcune informazioni su delphi vmt nel libro "delphi in a nutshell". u può iniziare da delphi in a nutshell chapter 2 o this
mi collego il mio sito per questo uno:
What is the virtual-method table?
E 'preciso come di Delphi 2005, credo.
Il VMT non ha alcun valore che fornisce il numero di puntatori del metodo virtuale che detiene. Nient'altro che il compilatore deve sapere che informazioni, quindi non c'è motivo di registrarlo per l'uso in fase di esecuzione.
Ero abbastanza sicuro che Hallvard avesse qualcosa sul VMT. Abbastanza sicuro, ha Hack #8: Explicit VMT calls che fa riferimento a Ray Lischner Secrets of Delphi 2 e Delphi in a Nut.
Ecco la sua versione modificata up del VMT
type
PClass = ^TClass;
PSafeCallException = function (Self: TObject; ExceptObject:
TObject; ExceptAddr: Pointer): HResult;
PAfterConstruction = procedure (Self: TObject);
PBeforeDestruction = procedure (Self: TObject);
PDispatch = procedure (Self: TObject; var Message);
PDefaultHandler = procedure (Self: TObject; var Message);
PNewInstance = function (Self: TClass) : TObject;
PFreeInstance = procedure (Self: TObject);
PDestroy = procedure (Self: TObject; OuterMost: ShortInt);
PVmt = ^TVmt;
TVmt = packed record
SelfPtr : TClass;
IntfTable : Pointer;
AutoTable : Pointer;
InitTable : Pointer;
TypeInfo : Pointer;
FieldTable : Pointer;
MethodTable : Pointer;
DynamicTable : Pointer;
ClassName : PShortString;
InstanceSize : PLongint;
Parent : PClass;
SafeCallException : PSafeCallException;
AfterConstruction : PAfterConstruction;
BeforeDestruction : PBeforeDestruction;
Dispatch : PDispatch;
DefaultHandler : PDefaultHandler;
NewInstance : PNewInstance;
FreeInstance : PFreeInstance;
Destroy : PDestroy;
{UserDefinedVirtuals: array[0..999] of procedure;}
end;
Avrete bisogno di leggere il suo articolo per ulteriori informazioni su l'hack però.
- 1. Dove posso trovare informazioni sull'attributo C++ [[deprecato]]
- 2. Dove posso trovare informazioni dettagliate sulle stringhe Query di Twitter4J?
- 3. Dove posso trovare una versione "Turbo" o "Lite" di Delphi?
- 4. Informazioni sulla struttura JSON - attributi e valori
- 5. Informazioni sui temi di jQuery Themeroller, dove posso trovare altro?
- 6. Dove posso trovare informazioni sulla corretta progettazione dell'architettura del progetto C#?
- 7. Dove posso trovare ulteriori informazioni sui flag D_GLIBCXX_DEBUG e DNDEBUG?
- 8. ottenere SQL informazioni di base sulla struttura della tabella Server
- 9. Dove posso trovare le guide aggiornate sulla compatibilità del browser?
- 10. Dove posso trovare Mono.Cecil.Pdb.dll?
- 11. Dove posso trovare ESAPI.properties?
- 12. Dove posso trovare GACUtil?
- 13. Dove trovare informazioni sui codici di messaggio di Windows WM?
- 14. Ottenere grandi informazioni sulla struttura dell'unità in DOS 7.x
- 15. Dove posso trovare tutorial z3py
- 16. Dove posso trovare l'algoritmo diff?
- 17. Dove posso trovare Tridion.ContentManager.Data.ContentManagement DLL?
- 18. Dove posso trovare il 16F877A.h?
- 19. Dove posso trovare utenti beta?
- 20. dove posso trovare l'estensione php_memcached.dll?
- 21. Informazioni sulla ricerca elastica
- 22. Dove posso trovare la documentazione di PythonMagick?
- 23. dove posso trovare l'origine di com.android.internal.R.styleable.AlertDialog_multiChoiceItemLayout?
- 24. Dove posso trovare un'implementazione di javax.validation. *?
- 25. Dove posso trovare un elenco di timezоnes?
- 26. Dove posso trovare la documentazione di Hpricot?
- 27. Dove posso trovare una introduzione all'uso di DUnit con Delphi 2007 o versioni successive?
- 28. Dove posso trovare la documentazione SimpleITK e le informazioni di riferimento?
- 29. Dove posso trovare informazioni sull'integrazione di applicazioni Java nel menu dell'indicatore dell'applicazione Ubuntu?
- 30. Dove posso trovare informazioni sull'algoritmo di ricerca del percorso D * o D * Lite?
VmtEquals? Non ne ho mai sentito parlare prima. Equals è uno dei due nuovi metodi virtuali in TObject per Delphi 2009? –
Sì. È necessario che alcune cose relative a Generics funzionino, credo. –
Allen: È molto bello! Proprio quello che stavo cercando. Tu dici che la struttura può e cambia.Quindi quale versione (s) di Delphi fa questo trucco per? –