导入功能需要stdcall吗?

时间:2012-03-21 06:50:32

标签: delphi delphi-7

我很好奇:

当我从使用 stdcall 调用约定导出的动态链接库导入函数时,是否必须在外部之前添加 stdcall Delphi从版本7开始?

LIBNAME int __stdcall Foo(void);

作为

function Foo: Integer; stdcall; external 'libname.dll';

或者我可以逃脱

function Foo: Integer; external 'libname.dll';

IIRC默认使用 stdcall ,但我不是100%肯定,你的意见是必需的。

修改

问题与32位库有关,Arnaud Bouchez提出了一个很好的观点,对于64位,调用约定没有被考虑,因为只有一个。

1 个答案:

答案 0 :(得分:10)

如果省略stdcall,则将使用默认调用约定register。因此,您必须包含stdcall

您使用external这一事实并未改变任何内容。默认的调用约定是register,即使对于外部导入也是如此。

当然,这仅在编译32位时才有意义。在x64 Windows上,ABI中指定了一个调用约定。在x64 Windows上,将忽略代码中指定的所有调用约定,并使用Windows x64调用约定进行所有函数调用。