tag preguntas para novio mejor las incomodas hacer con canciones amigos c++ dll

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 .

source