为什么在导出的dll函数末尾使用@number符号

时间:2018-12-25 05:42:26

标签: c++ dll dllexport dumpbin

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

我尝试过的事情:

 #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并导出包含@,< / p>

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

外部“ C”用于删除C类型的重整。是不适用于类或其他C ++类型。

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