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
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
.
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
.
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
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