为什么导出的 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++ 类型。
我读得太快了,但约翰更正确。
我有一个包含超过 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++ 类型。
我读得太快了,但约翰更正确。