【发布时间】:2010-11-12 07:15:47
【问题描述】:
谁能解释我如何在不获取和处理方法名称的情况下了解 dll 的调用约定?假设我们的应用程序正在加载第三方 dll,为了处理它,是否有任何有效的方法来了解 dll 的调用约定? (__stdcall, __cdecl, __fastcall)
【问题讨论】:
谁能解释我如何在不获取和处理方法名称的情况下了解 dll 的调用约定?假设我们的应用程序正在加载第三方 dll,为了处理它,是否有任何有效的方法来了解 dll 的调用约定? (__stdcall, __cdecl, __fastcall)
【问题讨论】:
如果符号以_ 开头但没有@,则它是__cdecl。如果它以_ 开头并有@,则它是__stdcall。如果它以@ 开头并有另一个@,则它是__fastcall。
【讨论】:
thiscall 怎么样(OP 没有问,但无论如何)?符号是否以 ? 开头?
在试图弄清楚为什么在链接第三方 dll 时会出现无法解析的符号时,我偶然发现了一种(某种)编程解决方案。
我使用来自Dbghelp.h 的UnDecorateSymbolName 针对 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 方法的名称之间的差异是 YAAAV 与 YGAAV。
【讨论】: