El archivo System.pas contiene una buena cantidad de información sobre desplazamientos VMT codificados, pero en realidad no parece decir mucho sobre la estructura del VMT. Lo que realmente me gustaría saber es, ¿hay alguna manera de averiguar el tamaño de un VMT en tiempo de ejecución, o en otras palabras, cuántos métodos virtuales existen para una clase determinada?¿Dónde puedo encontrar información sobre la estructura de Delphi VMT?
Respuesta
¿Qué pasa con la estructura de VMT que desea saber? También sabe que se trata de un detalle de implementación interna que está sujeto a cambios (y ha cambiado con el tiempo).
Para responder a su pregunta específica, aquí es una forma sencilla de encontrar el número de métodos virtuales para una clase dada:
function GetVirtualMethodCount(AClass: TClass): Integer;
begin
Result := (PInteger(Integer(AClass) + vmtClassName)^ -
(Integer(AClass) + vmtParent) - SizeOf(Pointer)) div SizeOf(Pointer);
end;
Esto funciona porque me he enterado de que la cadena que representa el nombre de la clase se coloca siguiendo inmediatamente todos los vectores de métodos virtuales en el VMT.
También sé que hay 11 métodos virtuales (para D2009, 9 para D2007 y anteriores) en todos los TObjects que se compensan negativamente desde el puntero de VMT.
Ese es el motivo de la referencia de vmtParent.
Finalmente, al usar una referencia de clase TClass, puede pasar cualquier clase derivada TObject a esta función y obtener la cantidad de métodos virtuales.
Google :-P para "delphi vmt" cede this. Tal vez esto te da un comienzo.
* sonrisa * ¡Me encanta Hallvard! Él es bueno en trucos como este. Desafortunadamente, él define los virtuales definidos por el usuario como una "matriz [0.999]", o en otras palabras, "más grande de lo que alguna vez necesitaría ser". Estoy buscando una manera de encontrar el tamaño real. –
Recuerdo que había información sobre delphi vmt en el libro "Delphi in a nutshell". puede comenzar desde delphi in a nutshell chapter 2 o this
me conecto mi propio sitio para éste:
What is the virtual-method table?
Es exacta en Delphi 2005, creo.
El VMT no tiene ningún valor que proporcione la cantidad de punteros de método virtual que contiene. Nada más que el compilador necesita saber esa información, por lo que no hay razón para grabarla para usarla en tiempo de ejecución.
Estaba bastante seguro de que Hallvard tenía algo en el VMT. Efectivamente, tiene Hack #8: Explicit VMT calls que hace referencia a Ray Lischner Secretos de Delphi 2 y Delphi in a Nutshell.
Aquí es su hackeado versión 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;
Usted tendrá que leer su artículo para más información sobre el hack sin embargo.
- 1. ¿Dónde puedo encontrar información sobre las variables especiales de Perl?
- 2. Dónde puedo encontrar información sobre el atributo C++ [[obsoleto]]
- 3. ¿Dónde encontrar información sobre los códigos de mensajes WM Windows?
- 4. ¿Dónde puedo encontrar la información de AppFabric Licensing?
- 5. ¿Dónde puedo encontrar información actualizada sobre la autenticación OpenID con rieles?
- 6. ¿Dónde puedo encontrar información sobre los patrones de implementación de NOSQL?
- 7. ¿Dónde puedo encontrar información sobre el algoritmo de determinación de ruta D * o D * Lite?
- 8. ¿Dónde puedo obtener información sobre el kernel de Windows?
- 9. ¿Dónde puedo obtener información sobre los sistemas de recomendación?
- 10. ¿Dónde puedo encontrar información sobre las API de blog y cómo usarlas?
- 11. ¿Dónde puedo encontrar recursos sobre la programación C "moderna"?
- 12. ¿Dónde puedo encontrar un tutorial sobre la rueda giratoria?
- 13. ¿Dónde puedo encontrar un control de mapa para Delphi?
- 14. ¿Dónde puedo encontrar información sobre cómo crear complementos para SQL Server Management Studio?
- 15. ¿Dónde puedo encontrar una versión "Turbo" o "Lite" de Delphi?
- 16. ¿Dónde puedo encontrar información sobre las partes internas del motor Javascript?
- 17. ¿Dónde puedo encontrar información detallada sobre cómo interactúa AWT con el sistema operativo nativo?
- 18. ¿Dónde puedo aprender sobre MEF?
- 19. Delphi - Información RTTI sobre métodos en registros
- 20. ¿Dónde puedo encontrar información sobre la integración de aplicaciones Java en el menú de indicadores de la aplicación Ubuntu?
- 21. ¿Dónde encontrar recursos sobre Refactorización?
- 22. ¿Dónde puedo encontrar documentación sobre los caracteres de escape como "\"
- 23. ¿Dónde puedo encontrar la documentación de MSpec?
- 24. ¿Dónde puedo obtener más información sobre la función de traducción de PyPy?
- 25. ¿Dónde puedo encontrar la documentación jsdom?
- 26. ¿Dónde puedo encontrar buena documentación de AREL?
- 27. ¿Dónde encontrar la información de configuración del conjunto?
- 28. encontrar información sobre los operadores Scala
- 29. ¿Dónde puedo encontrar la documentación de SimpleITK y la información de referencia?
- 30. ¿Dónde puedo encontrar TableDiff.exe?
VmtEquals? Nunca había oído hablar de eso antes. ¿Es igual uno de los dos nuevos métodos virtuales en TObject para Delphi 2009? –
Sí. Es necesario para que funcionen ciertas cosas relacionadas con los genéricos, creo. –
Allen: ¡Eso es muy bueno! Justo lo que estaba buscando. Usted dice que la estructura puede cambiar y cambia.Entonces, ¿de qué versión (s) de Delphi funciona ese truco? –