2012-03-21 61 views
4

我很好奇这样的:stdcall需要导入函数吗?

当我从出口使用STDCALL调用约定一个动态链接库导入功能,是强制要求在德尔福之前外部添加STDCALL从7版本开始?

LIBNAME int __stdcall Foo(void); 

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

或者我可以在默认情况下逃脱只是

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

IIRC它会使用STDCALL,但我不是100%当然,你的意见是必需的。

编辑

问题是关系到32位的库,阿尔诺Bouchez取得了一个很好的点,对于64位,调用约定是不是因为只有一个考虑。

+0

可以“蒙混过关”漏掉了该函数的调用约定,因为当有一个简单的返回类型,没有参数,STDCALL并注册的行为相同。 – 2012-03-21 13:05:26

+0

@RobKennedy该死的例子!你是对的,实际上除了我导入的其中一个功能都有一个或多个参数外,感谢你提供的单挑Rob! (: – ComputerSaysNo 2012-03-21 13:14:58

回答

10

如果省略stdcall则将使用默认调用约定register。所以你必须包括那stdcall

您正在使用external没有任何改变的事实。默认调用约定是register,即使对于外部输入。

当然,编译为32位时,这只是问题。在x64 Windows上,有一个在ABI中指定的单一调用约定。在x64 Windows上,忽略代码中指定的所有调用约定,并且所有函数调用都是使用Windows x64调用约定进行的。

+0

+1并接受谢谢大卫,是不知道,这是适用于所有版本的Delphi真 – ComputerSaysNo 2012-03-21 07:06:47

+1

所有版本 – 2012-03-21 07:07:56

+0

真棒,谢谢! – ComputerSaysNo 2012-03-21 07:09:05