2012-03-21 25 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

相關問題