【问题标题】:How to remove the underscore from DLL export如何从 DLL 导出中删除下划线
【发布时间】: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


【解决方案1】:

我认为最简单的方法是添加

// in cpp, but will probably work in header too
#pragma comment(linker, "/export:FunctionName@4=_FunctionName@4")

// in header
extern "C" __declspec(dllexport) void __stdcall FunctionName(int param);

在您的 DLL 的源代码中。

我的想法来自here。他们还解释了如何使用 DEF 文件进行操作。我猜是口味问题。您最终将在导出表中为同一函数提供两个条目,但应用程序应该能够获得正确的 proc 地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2019-11-25
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多