有没有人可以解释我如何在不获取和处理方法名称的情况下了解dll的调用约定?让我们说我们的应用程序正在加载第三方DLL并且为了处理它,有没有任何有效的方法来了解dll的调用约定? (__stdcall,__ cdecl,__ fastcall)
答案 0 :(得分:26)
如果符号以_
开头但没有@
,则为__cdecl
。如果它以_
开头并且@
为__stdcall
。如果它以@
开头并且有另一个@
,则为__fastcall
。
答案 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}}。