【发布时间】: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 位时代,并且从那以后它就没有改变过。