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