导入功能需要stdcall吗?

Com*_*sNo 4 delphi delphi-7

我很好奇这个:

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

LIBNAME int __stdcall Foo(void);
Run Code Online (Sandbox Code Playgroud)

function Foo: Integer; stdcall; external 'libname.dll';
Run Code Online (Sandbox Code Playgroud)

或者我可以逃脱

function Foo: Integer; external 'libname.dll';
Run Code Online (Sandbox Code Playgroud)

IIRC默认情况下会使用stdcall,但我不是100%肯定,你的意见是必需的.

编辑:

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

Dav*_*nan 10

如果省略,stdcall则将使用默认调用约定register.所以你必须包含它stdcall.

您正在使用的external事实不会改变任何事情.register即使对于外部导入,默认调用约定也是如此.

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

  • @David构建64位应用程序时,Delphi XE2不是必需的:在这种情况下,只有一个调用约定.添加stdcall不会改变任何东西. (3认同)