Как найти соглашение о вызовах сторонних DLL? - PullRequest
22 голосов
/ 12 ноября 2010

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

Ответы [ 2 ]

27 голосов
/ 12 ноября 2010

Если символ начинается с _, но не имеет @, то это __cdecl.Если оно начинается с _ и имеет @, это __stdcall.Если он начинается с @ и имеет другой @, это __fastcall.

source

2 голосов
/ 10 ноября 2014

Пытаясь выяснить, почему я получаю неразрешенные символы при связывании с сторонним 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
        "?OFFReader@IO@OpenMesh@@YGAAV_OFFReader_@12@XZ",
        out,
        // Length of symbol
        46,
        UNDNAME_32_BIT_DECODE);
}

Есть определенно более красивые способы сделать это. Я просто запускаю его в отладчике и смотрю содержимое out.

Также стоит отметить, вопреки ответу Игнасио, разница между искаженными именами для cdecl методов в dll и stdcall, которые искали, была YAAAV против YGAAV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...