2010-11-12 10 views
17

Qualcuno potrebbe spiegarmi come conoscere la convenzione di chiamata di una DLL senza ottenere ed elaborare i nomi dei metodi? Diciamo che la nostra applicazione sta caricando una DLL di terze parti e per gestirla, esistono dei modi efficaci per conoscere la convenzione di chiamata di una DLL? (__stdcall, __cdecl, __fastcall)Come trovare la convenzione di chiamata di una dll di terze parti?

risposta

23

Se il simbolo inizia con un _ ma non ha @, quindi è __cdecl. Se inizia con _ e ha un @ è __stdcall. Se inizia con @ e ha un altro @, è __fastcall.

source

+0

Grazie mille Ignacio Vazquez-Abrams. C'è un altro modo efficace per scoprirlo? c'è qualche funzione di libreria per ottenere la convenzione di chiamata? – RoboAlex

+7

Questo naturalmente presuppone che la DLL sia compilata da MSVC, come dice l'articolo collegato nell'introduzione. Suppone anche che non ci sia un file DEF usato. Basta provare a trovare la convenzione di chiamata utilizzata da USER32.DLL con questo metodo - non funziona. – MSalters

1

Mentre si cerca di capire il motivo per cui mi è stato sempre simboli non risolti quando si collega contro una DLL di terze parti sono incappato in un (quasi) soluzione programmatica.

ho scritto un piccolo programma contro l'API di Windows utilizzando UnDecorateSymbolName da Dbghelp.h per decodificare il sistema di mutilazione:

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

ci sono modi sicuramente più carine per farlo. L'ho appena eseguito in un debugger e guardo i contenuti di out.

Vale anche la pena notare, contrariamente alla risposta di Ignacio, la differenza tra i nomi alterati per le cdecl metodi nella DLL e il stdcall metodi per essere guardato era YAAAV vs. YGAAV.

Problemi correlati