【问题标题】:why the @number symbol at the end of an exported dll function为什么导出的 dll 函数末尾的 @number 符号
【发布时间】:2018-12-25 05:42:26
【问题描述】:

我有一个包含超过 400 个函数的 dll,而我的 exe 文件只使用了 dll 中的 15 个函数,所以我需要创建一个新的 dll 并导出函数并伪造它们的返回值来模拟输出更复杂的系统。

我尝试过的:

 #include "stdafx.h"

//the compiler complains about the '@20'

__declspec ( dllexport ) XLStatus _xlActivateChannel@20(XLportHandle,  XLuint64, unsigned int, unsigned int)
{
    return 0;
} 

// causing the exe to crash

dumpbin /exports vxlapi.dll(原始 dll):显示重复的函数名(不是所有函数)

ordinal  name
         _xlActivateChannel@20
14       xlActivateChannel

注意:在dll的头文件中,函数是这样声明的:

DECL_STDXL_FUNC ( xlActivateChannel, XLACTIVATECHANNEL, (
                  XLportHandle  portHandle,
                  XLaccess      accessMask,
                  unsigned int  busType,
                  unsigned int  flags)
                  );

在 dumpbin / 导出 dll 为什么函数名称以 '_' 下划线开头并以 '@number' 结尾,注意:exe 正在使用 let's say(decorated) 函数,我如何创建一个新的 dll 并导出包含 @,

【问题讨论】:

  • 首先,“@”表示参数列表占用的字节数。第二,去掉“@”,see this answer。简而言之,您需要在构建 DLL 时使用模块定义文件。
  • @PaulMcKenzie 提到使用 __declspec(dllexport) docs.microsoft.com/en-us/cpp/build/reference/…时不需要 .def 文件
  • 当然你不需要 DEF 文件。如果您希望导出的函数名称不使用任何修饰(只是一个没有任何修饰的干净函数名称),您确实需要一个。我不确定您要完成什么,但无论是什么,您都需要知道完成所有这些装饰的时间、地点和原因——这不是您要问的问题吗?有 C++ 名称重整和 Windows“重整”——两者都是独立的,并且处理方式不同。
  • 模块定义文件是指头文件,不是吗?对不起,我是新手,还有 c++
  • 不,模块定义文件只是一个描述导出的文本文件,并且可以选择给它们一个“干净”的名称。这是我所知道的使用 Visual C++ 工具集创建导出名称的唯一方法,并且导出的名称显示时没有任何 Windows 装饰(“@”内容)。自从我相信创建 Windows 操作系统以来就是这种情况,甚至可以追溯到 16 位时代,并且从那以后它就没有改变过。

标签: c++ dll dllexport dumpbin


【解决方案1】:

"@n" is used by the stdcall 调用约定。您不需要在声明中提及它,只需将声明更改为stdcall,以便编译器知道它们需要用“@n”后缀修饰。像这样:

__declspec ( dllexport ) XLStatus __stdcall _xlActivateChannel(XLportHandle,  XLuint64, unsigned int, unsigned int)

【讨论】:

  • 我认为 __stdcall 应该放在函数名之前
  • @Stoura:谢谢,你说得对,我更新了答案。
【解决方案2】:

名称修改是 C++ 等的典型特征,这就是为什么您会在导出中看到这些符号的原因。 Ansi C 出口没有被破坏。不允许使用 @ 符号。你可以试试 AT 或 _AT。

extern "C" 用于移除 C 类型的修饰。 Is 不适用于类或其他 C++ 类型。

我读得太快了,但约翰更正确。

【讨论】:

  • 典型的 C 编译器 会在名称前添加下划线。
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2015-06-16
  • 2020-06-20
  • 2020-08-23
  • 2020-08-09
相关资源
最近更新 更多