c++ - preguntas - tags para hacer
¿Cómo encontrar la convención de llamada de un tercero dll? (2)
¿Podría alguien explicarme cómo conocer la convención de llamada de un dll sin obtener y procesar los nombres de los métodos? Digamos que nuestra aplicación está cargando un archivo DLL de terceros y para manejarlo, ¿hay alguna forma efectiva de conocer la convención de llamada de un archivo DLL? (__stdcall, __cdecl, __fastcall)
Al tratar de averiguar por qué obtenía símbolos no resueltos al vincularme con una DLL de terceros, me topé con una (más o menos) solución programática.
Escribí un pequeño programa contra la API de Windows usando UnDecorateSymbolName de Dbghelp.h para descifrar el esquema de Dbghelp.h :
#include "Windows.h"
#include "Dbghelp.h"
#include "tchar.h"
int _tmain(int argc, _TCHAR* argv[])
{
CHAR out[512];
UnDecorateSymbolName(
// Mangled symbol
"?OFFReader@IO@OpenMesh@@YGAAV_OFFReader_@12@XZ",
out,
// Length of symbol
46,
UNDNAME_32_BIT_DECODE);
}
Definitivamente hay maneras más bonitas de hacerlo. Simplemente lo ejecuto en un depurador y miro el contenido de out.
También vale la pena señalar, contrariamente a la respuesta de Ignacio, que la diferencia entre los nombres modificados para los métodos cdecl en dll y los métodos stdcall buscados fue YAAAV vs. YGAAV .
Si el símbolo comienza con un _ pero no tiene @ , entonces es __cdecl . Si comienza con _ y tiene una @ es __stdcall . Si comienza con @ y tiene otra @ , es __fastcall .