2010-11-12 15 views
17

¿Podría alguien explicarme cómo conocer la convención de llamadas de un dll sin obtener y procesar nombres de métodos? Digamos que nuestra aplicación está cargando un dll de un tercero y para manejarlo, ¿hay formas efectivas de conocer la convención de llamadas de un dll? (__stdcall, __cdecl, __fastcall)¿Cómo encontrar la convención de llamadas de un tercero dll?

Respuesta

23

Si el símbolo comienza con _ pero no tiene @, entonces es __cdecl. Si comienza con _ y tiene un @, es __stdcall. Si comienza con @ y tiene otro @, es __fastcall.

source

+0

Muchas gracias Ignacio Vazquez-Abrams. ¿Hay alguna otra manera efectiva de descubrirlo? ¿Hay alguna función de biblioteca para obtener la convención de llamadas? – RoboAlex

+7

Esto, por supuesto, asume que MSVC compila el DLL, como dice el artículo vinculado en la introducción. También asume que no hay un archivo DEF utilizado. Intente encontrar la convención de llamada utilizada por USER32.DLL con este método: no funciona. – MSalters

1

Al tratar de averiguar por qué me estaba símbolos sin resolver cuando se enlaza contra una DLL de terceros me topé con una solución de programación (más o menos).

me escribió un pequeño programa en contra de la API de Windows usando UnDecorateSymbolName de Dbghelp.h para decodificar el esquema mangling:

#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); 
} 

hay maneras definitivamente más bonitas de hacerlo. Simplemente lo ejecuto en un depurador y miro el contenido de afuera.

También digno de mención, en contra de la respuesta de Ignacio, la diferencia entre los nombres alterados para los cdecl métodos en el DLL y los métodos stdcall siendo buscado era YAAAV vs YGAAV.

Cuestiones relacionadas