6

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

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

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

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

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

4

3 回答 3

7

您应该使用 .DEF 文件:

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

在这里我们有

externalname = internalname 
于 2011-05-13T06:38:16.857 回答
0

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

于 2011-05-13T07:10:19.450 回答
0

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

于 2016-09-22T08:33:55.983 回答