【问题标题】:How to find the calling convention of a third party dll?如何找到第三方dll的调用约定?
【发布时间】:2010-11-12 07:15:47
【问题描述】:

谁能解释我如何在不获取和处理方法名称的情况下了解 dll 的调用约定?假设我们的应用程序正在加载第三方 dll,为了处理它,是否有任何有效的方法来了解 dll 的调用约定? (__stdcall, __cdecl, __fastcall)

【问题讨论】:

    标签: c++ dll


    【解决方案1】:

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

    source

    【讨论】:

    • 非常感谢伊格纳西奥·巴斯克斯-艾布拉姆斯。有没有其他有效的方法来找出它?是否有任何库函数来获取调用约定?
    • 这当然假设 DLL 是由 MSVC 编译的,正如链接文章在介绍中所说。它还假设没有使用 DEF 文件。只需尝试通过此方法查找 USER32.DLL 使用的调用约定 - 不起作用。
    • thiscall 怎么样(OP 没有问,但无论如何)?符号是否以 ? 开头?
    【解决方案2】:

    在试图弄清楚为什么在链接第三方 dll 时会出现无法解析的符号时,我偶然发现了一种(某种)编程解决方案。

    我使用来自Dbghelp.hUnDecorateSymbolName 针对 Windows API 编写了一个小程序来解码 mangling 方案:

    #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);
    }
    

    肯定有更漂亮的方法可以做到这一点。我只是在调试器中运行它并查看输出的内容。

    另外值得注意的是,与 Ignacio 的回答相反,dll 中的 cdecl 方法和正在寻找的 stdcall 方法的名称之间的差异是 YAAAVYGAAV

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多