【发布时间】:2015-03-20 12:27:10
【问题描述】:
我想替换一个我没有完整源代码(但函数声明)的 DLL。应用程序在运行时加载此 DLL 并使用(所有)函数名称调用 GetProcAddress。 (所以我必须将函数命名为完全相同)。
我创建了一个新的 DLL(在 MS VC2013 中)并编写了函数。但我无法正确导出它们。
在原始 DLL 中,它们使用 _stdcall 定义,但它们的名称不以下划线开头。
如果我像这样在 .def 文件中指定名称 testfunc@4=testfunc,@ 后面的所有内容都会被删除。
如何在 VS2013 中指定我想要像 testfunc@4 这样的 DLL 导出?
【问题讨论】:
-
您是否尝试将它们导出为
extern "C"? -
我依稀记得这是个问题,但无法在 VS2013 上重现。应该是
testfunc@4 = _testfunc@4右边没有@,@4 被解释为序数。 -
extern "c" 删除了所有装饰(什么不是我想要的 - 我需要最后的 @4;如果我指定您在 .def 文件中提到的行,链接器似乎会剥离“@”之后的所有内容
-
原始 DLL 可能是由 GCC 或其变体之一创建的。
-
可能值得注意的是,在编译纯 C 单元 (.c) 时无法使用
extern "C"。因此,流行的#ifdef __cplusplus在使用之前进行检查。但是如果你正在编译 C,那导出修饰是不可避免的。
标签: c++ c dll dllexport name-decoration