Может ли кто-нибудь объяснить мне, как узнать соглашение о вызове dll без получения и обработки имен методов? Допустим, наше приложение загружает DLL третьей стороны и для того, чтобы справиться с этим, есть ли эффективные способы узнать о вызывающем соглашении DLL? (__stdcall, __cdecl, __fastcall)
Как найти соглашение о вызове сторонней DLL?
Ответ 1
Если символ начинается с _
, но не имеет @
, то он __cdecl
. Если он начинается с _
и имеет @
it __stdcall
. Если он начинается с @
и имеет другой @
, он __fastcall
.
Ответ 2
При попытке выяснить, почему я получаю неразрешенные символы при связывании с сторонней dll, я наткнулся на (вроде) программное решение.
Я написал небольшую программу против Windows API, используя UnDecorateSymbolName
из 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);
}
Есть определенно более красивые способы сделать это. Я просто запускаю его в отладчике и просматриваю содержимое.
Также стоит отметить, что, вопреки Игнасио, разница между искаженными именами для методов cdecl
в dll и используемыми методами stdcall
была YAAAV
vs. YGAAV
.