没有 DEF 文件的 DLL 导出 __stdcall 和用 VS 修饰的函数名

DLL export __stdcall without DEF file and decorated function names with VS

  1. 如果我有一个 DLL 文件...我如何才能看到函数构建为 __stdcall 或 __cdecl?
  2. 我想创建一个 DLL 以将函数导出为 __stdcall 而不使用 DEF 文件,并使用 Visual Studio 装饰函数名称,例如:
__declspec(dllexport) int __stdcall TestFunktion(void)
{
  return 0;
}

结果如下所示:

在Visual Studio中,有没有简单的方法可以在没有DEF文件的情况下创建没有修饰的函数?

解决此问题的标准方法是在 .def 文件中定义导出的未修饰名称 - 这是您应该使用的方法。


但是如果出于某种原因您不想使用 .def 文件,您可以编写如下代码:

__declspec(dllexport) int __stdcall TestFunktion(void)
{
    #pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
    ...
}

__FUNCDNAME__ 将评估您的修饰函数名称,而 __FUNCTION__ 将评估您未修饰的函数名称 - 这实际上是 .def 文件中等效行的替代。


关于你的另一个问题:

If I have a DLL file...how can I see functions are built as __stdcall or __cdecl?

仅从 DLL 来看,这是严格不可能的,如果您故意从导出 table 中省略提示,则更不用说了(即您可能会看到一个修饰的导出符号并推断它是 __stdcall, 但你选择将它们导出为未修饰的符号) - 也许如果你对函数的反汇编进行某种分析并尝试理解它的调用约定,但这是非封闭的并且非常 hacky。

这就是为什么有据可查的调用约定和有据可查的 API 签名很重要的原因。