我的公司为第三方提供了一个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并且不以下划线('_')作为前缀?
答案 0 :(得分:7)
您应该使用.DEF文件:
EXPORTS
HTMLayoutClassNameA = HTMLayoutClassNameA
HTMLayoutClassNameW = HTMLayoutClassNameW
HTMLayoutClipboardCopy = HTMLayoutClipboardCopy
...
我们有
externalname = internalname
答案 1 :(得分:0)
Borland C / C ++编译器可以选择打开和关闭符号上的下划线生成。 -u
(默认值)在符号名称上生成下划线。将-u-
添加到命令行,看看是否有帮助。 (我不确定CodeRad中的这个位置,但我非常肯定会记住它可以在IDE中的某个地方完成。)
答案 2 :(得分:0)
使用-vu编译器选项不将下划线前缀加到bcc中的导出符号名称