Может ли кто-нибудь объяснить мне, как узнать соглашение о вызове 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.