__cdecl强制使用带下划线的前缀

__cdecl forcing prefix with underscore

本文关键字:下划线 前缀 cdecl      更新时间:2023-10-16

我的公司为第三方提供了一个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。

所以我的问题是,如何以__cdecl且带有下划线('_')前缀的方式从我的新 DLL 导出 API 函数?

你应该使用 .DEF 文件:

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

在这里我们有

externalname = internalname 

Borland C/C++编译器可以选择打开和关闭符号的下划线生成。 -u(默认值)在符号名称上生成下划线。将-u-添加到命令行,看看是否有帮助。(我不确定在 CodeRad 中的哪个位置执行此操作,但我几乎可以记住它可以在 IDE 中的某个地方完成)。

使用 -vu 编译器选项,不在密件抄送中导出的符号名称前面加上下划线