Normalmente, en Delphi se declararía una función con un número variable de argumentos utilizando el método 'array of const'. Sin embargo, para la compatibilidad con el código escrito en C, hay una directiva 'varargs' mucho desconocida que se puede agregar a una declaración de función (lo aprendí al leer el excelente documento 'Pitfalls of convering' de Rudy).¿Cómo puede una función con 'varargs' recuperar el contenido de la pila?
A modo de ejemplo, se podría tener una función en C, declarada así:
void printf(const char *fmt, ...)
En Delphi, esto se convertiría en:
procedure printf(const fmt: PChar); varargs;
Mi pregunta es: ¿Cómo puedo llegar a el contenido de la pila al implementar un método que se define con la directiva 'varargs'?
Espero que existan algunas herramientas para esto, como las traducciones de Dephi de las funciones va_start(), va_arg() y va_end(), pero no puedo encontrarlo en ninguna parte.
Por favor ayuda!
PD: Por favor, no se distraiga en las discusiones sobre la alternativa 'por qué' o 'array of const' - Necesito esto para escribir parches tipo C para las funciones dentro de los juegos de Xbox (vea el proyecto Delphi Xbox emulator ' Dxbx 'en sourceforge para más detalles).
¡Esto se ve genial! Me sorprendió ver que de hecho no hay necesidad de utilizar ensamblaje para acceder al contenido del registro ESP. Gracias por esto, ¡excelente ejemplo también! – PatrickvL
Tenga en cuenta que el código necesita adaptación si va a funcionar en x64: la función Align en particular trunca los punteros a valores de 32 bits. –