如何找到第三方DLL的调用约定?

时间:2010-11-12 07:15:47

标签: c++ dll

有没有人可以解释我如何在不获取和处理方法名称的情况下了解dll的调用约定?让我们说我们的应用程序正在加载第三方DLL并且为了处理它,有没有任何有效的方法来了解dll的调用约定? (__stdcall,__ cdecl,__ fastcall)

2 个答案:

答案 0 :(得分:26)

如果符号以_开头但没有@,则为__cdecl。如果它以_开头并且@__stdcall。如果它以@开头并且有另一个@,则为__fastcall

source

答案 1 :(得分:2)

在试图弄清楚为什么我在与第三方dll链接时遇到未解决的符号时,我偶然发现了一种(某种)程序化解决方案。

我使用UnDecorateSymbolName中的Dbghelp.h编写了一个针对Windows API的小程序来解码修改方案:

#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的内容。

另外值得注意的是,与Ignacio的回答相反,dll中的cdecl方法与要查找的stdcall方法的错位名称之间的差异为YAAAV与{{{ 1}}。