Ver Mensaje Individual
  #7  
Antiguo 03-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por poyo Ver Mensaje
Volviendo a GetVirtualMethodCount, a mí tampoco me queda del todo claro. :S
Sí cómo es obtenido y eso, pero exactamente porqué.
Sé que juegan con punteros. Toman el final de la vmt...
Tengo una idea de dónde está la clave de eso, era algo que sólo suponía pero no había visto con detenimiento esta sentencia:
Código Delphi [-]
EndVMT := pinteger(integer(AClass) + vmtClassName)^;
Tal parece que la estructura de la VMT finaliza con el ShortString que contiene el nombre de la clase, lo cual es bastante lógico. Es información intrínseca de la VMT, pero, como es de longitud variable, en el desplazamiento vmtClassName sólo guardan un puntero a ese ShortString, así la estructura inicial permanece uniforme para todas las VMTs y rematan estas estructuras con el propio nombre de la clase. Es una técnica bastante usual colocar al final de una estructura las partes que pueden ser de tamaño variable.

No lo he probado, pero entonces con esto sí podríamos saber cuántas entradas de métodos virtuales y de métodos de interfaces tiene una VMT. Ahora la pregunta sería, ¿cómo distinguir unas de otras? Y algo más de considerar: la función GetVirtualMethodCount que enlacé parece ser de una versión más reciente que la mostrada inicialmente, y en ella el algoritmo es significativamente distinto.

Habrá que hacer algunas pruebas adicionales en un rato libre...

Espero te alivies de los dolores de cabeza, Poyo, tómalo con calma. Son simples bytes.

Me entusiasma participar con los colegas en este tipo de disertaciones.

Saludos.

Al González.
Responder Con Cita