为什么导出的 dll 函数末尾有 @number 符号

why the @number symbol at the end of an exported dll function

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

我尝试过的:

 #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 使用的是假设(装饰)函数,我如何创建一个新的 dll 并导出包含@,

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

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

名称重整对于 C++ 等是典型的,这就是您在导出中看到这些符号的原因。 Ansi C 导出没有损坏。 @ 符号是不允许的。您可以试试 AT 或 _AT。

extern "C" 用于移除 C 类型的重整。 Is 不适用于 class 或其他 C++ 类型。

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