2010-11-12 4 views
17

Quelqu'un peut-il m'expliquer comment connaître la convention d'appel d'une DLL sans obtenir et traiter les noms de méthodes? Disons que notre application charge une DLL tierce et pour la gérer, y a-t-il des moyens efficaces de connaître la convention d'appel d'une DLL? (__stdcall, __cdecl, __fastcall)Comment trouver la convention d'appel d'une DLL tierce?

Répondre

23

Si le symbole commence par _ mais n'a pas @, alors il s'agit de __cdecl. Si cela commence par _ et a @ c'est __stdcall. Si cela commence par @ et a un autre @, c'est __fastcall.

source

+0

Merci beaucoup Ignacio Vazquez-Abrams. Y a-t-il un autre moyen efficace de le découvrir? Y at-il des fonctions de bibliothèque pour obtenir la convention d'appel? – RoboAlex

+7

Cela suppose bien sûr que la DLL est compilée par MSVC, comme le dit l'article lié dans l'introduction. Il suppose également qu'il n'y a pas de fichier DEF utilisé. Essayez simplement de trouver la convention d'appel utilisée par USER32.DLL par cette méthode - ne fonctionne pas. – MSalters

1

Tout en essayant de comprendre pourquoi je recevais des symboles non résolus lors de la liaison d'un dll tiers je suis tombé sur une solution programmatique (en quelque sorte).

j'ai écrit un petit programme contre l'API Windows en utilisant UnDecorateSymbolName de Dbghelp.h pour décoder le système de mutiler:

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

Il existe des moyens certainement plus joli de le faire. Je l'ai juste exécuté dans un débogueur et regardé le contenu de dehors.

A noter également, contrairement à la réponse de Ignacio, la différence entre les noms déchiquetés pour les cdecl méthodes dans le dll et les méthodes stdcall étant recherché était YAAAV contre YGAAV.

Questions connexes