Imagine que desea escribir un programa que pruebe funciones en un archivo C++ dll. Debe permitir al usuario seleccionar un dll (suponemos que estamos hablando de C++ dlls). Debería poder obtener una lista de todas las funciones exportadas por el dll. Luego, el usuario debería poder seleccionar un nombre de función de la lista, ingresar manualmente una lista de argumentos (los argumentos son todos básicos, como int, double, bool o char arrays (por ejemplo, cadenas tipo c)) e intentar para ejecutar la función seleccionada con los argumentos especificados. Le gustaría saber si la función se ejecuta con los argumentos especificados, o hacen que se bloquee (porque no coinciden con la firma, por ejemplo).¿Puedo deducir programáticamente la convención de llamadas utilizada por un dll de C++?
El problema principal es que C++, al ser un lenguaje fuertemente tipado, requiere conocer el número y tipo de los argumentos a favor de una llamada de función en tiempo de compilación time.And en mi caso, simplemente no sé qué estos argumentos son, hasta que el usuario los selecciona en tiempo de ejecución.
La única solución que se me ocurrió fue utilizar el ensamblado para insertar manualmente los argumentos en la pila de llamadas.
Sin embargo, he llegado a entender que si quiero meterme con el ensamblado, será mejor que me asegure de saber qué convención de llamadas son las funciones en el dll.
Así que (finalmente :) aquí está mi pregunta: ¿puedo deducir el programa de convención de llamadas matemáticamente? Dependencia Walker no me ayudará, y no tengo idea de cómo leer manualmente el formato PE.
¿Por qué no hace que el usuario especifique también la convención de llamadas? Predeterminado a stdcall (que es lo que es en dlls generados por los compiladores de Microsoft en estos días), pero permite al usuario cambiarlo. –
Bueno, maldición. ¡Simplemente no había pensado en eso! Tengo que verificar si puedo hacerlo, pero si lo hago, esta sería una solución válida :))) –