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
.