【问题标题】:__cdecl forcing prefix with underscore__cdecl 强制前缀带下划线
【发布时间】:2011-08-24 16:33:56
【问题描述】:

我的公司向第三方提供了一个 DLL,该 DLL 为他们提供了 API 函数,他们可以使用这些函数连接到我们的应用程序。 DLL 是用 VC9 编写的,API 函数使用 VC 的默认调用约定 (__cdecl)。第三方围绕这个接口构建了他们的应用程序。

我现在的任务是编写 DLL 的更新版本。我们希望 DLL 具有与旧接口完全相同的接口,以便它们可以互换使用。不幸的是,我们现在的开发环境是 CodeGear RAD Studio 2007,所以我必须使用它来编写 DLL。

最好的解决方案是让新旧 DLL 都将它们的函数导出为 __stdcall。然后可以重新链接第三方应用程序以期待 __stdcall 功能,每个人都会很高兴。不幸的是,由于各种原因,这不太可能发生。

或者,我可以将 DLL 中的函数声明为 __cdecl。第三方需要 __cdecl 函数,所以这似乎是一个很好的解决方案。不幸的是,CodeGear 坚持在 __cdecl 函数的名称后面加上下划线 ('_')。这意味着第三方应用程序必须有条件地调用 MyApiFunction(...)_MyApiFunction(...),具体取决于他们使用的 DLL。

所以我的问题是,如何从我的新 DLL 中导出 API 函数,使其为 __cdecl 并且 以下划线 ('_') 为前缀?

【问题讨论】:

  • 当编译器决定不遵守调用约定时,调用约定有什么价值?
  • VC9 的 __cdecl 和 Borland 的 __cdecl 的工作方式相同(从右到左的参数顺序,调用者清理,堆栈上的参数),如果不是为了名称装饰,它们会一起工作.
  • Hoppy: 命名装饰是不是约定中没有定义?
  • 你指的是什么约定? VC9 和 Borland 有自己的 __cdecl 实现,它们(仅)在装饰导出函数名称的方式上有所不同。
  • @nightcracker 您在这里寻找的概念被称为 ABI——它使不同编译器生成的二进制图像可互操作。 C,不幸的是,lacks a standardized ABI.

标签: c++ dll export borland-c++ cdecl


【解决方案1】:

您应该使用 .DEF 文件:

EXPORTS
    HTMLayoutClassNameA = HTMLayoutClassNameA
    HTMLayoutClassNameW = HTMLayoutClassNameW
    HTMLayoutClipboardCopy = HTMLayoutClipboardCopy
    ...

我们来了

externalname = internalname 

【讨论】:

  • 感谢 c-smile - 这解决了我的问题。现在一切正常 - 干杯。
【解决方案2】:

Borland C/C++ 编译器有一个选项可以打开和关闭符号的下划线生成。 -u(默认)在符号名称上生成下划线。将-u- 添加到命令行,看看是否有帮助。 (我不确定在 CodeRad 中的何处执行此操作,但我非常确定可以在 IDE 中的某个位置执行此操作)。

【讨论】:

  • 我已经尝试过了,不幸的是它所做的只是产生了一堆神秘的构建错误。无论如何,谢谢。
【解决方案3】:

使用 -vu 编译器选项不为 bcc 中导出的符号名称添加下划线前缀

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多