Подтвердить что ты не робот

Как найти соглашение о вызове сторонней DLL?

Может ли кто-нибудь объяснить мне, как узнать соглашение о вызове dll без получения и обработки имен методов? Допустим, наше приложение загружает DLL третьей стороны и для того, чтобы справиться с этим, есть ли эффективные способы узнать о вызывающем соглашении DLL? (__stdcall, __cdecl, __fastcall)

4b9b3361

Ответ 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.