c++ - preguntas - tags para hacer con amigos




¿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
        "[email protected]@[email protected]@[email protected]@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





dll