2012-03-21 4 views
4

мне очень интересно об этом:stdcall требуется для импорта функции?

Когда я импортировать функции из динамической библиотеки, которая экспортирует с помощью 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% конечно, ваше мнение требуется.

EDIT:

Вопрос связан с библиотекой 32-битном, Arnaud Буше сделали хороший момент, что для 64-битного, то соглашение о вызовах не принимаются во внимание, так как есть только один.

+0

Вы можете «уйти с», опустив соглашение о вызове на эту функцию, потому что, когда есть простой тип возврата и нет параметров, stdcall и register ведут себя одинаково. –

+0

@RobKennedy проклятые примеры! вы правы, на самом деле все, кроме одной функции, которую я импортирую, имеют 1 или более параметров, спасибо за хедз-ап Роб! (: – ComputerSaysNo

ответ

10

Если вы опустите stdcall, тогда будет использоваться соглашение о назначении по умолчанию register. Поэтому вы должны указать, что stdcall.

Тот факт, что вы используете external, ничего не меняет. Стандарт вызова по умолчанию - register, даже для внешнего импорта.

Конечно, это имеет значение только при компиляции для 32 бит. В x64 Windows существует единое соглашение о вызове, указанное в ABI. В Windows x64 все вызовы, указанные в коде, игнорируются, и все вызовы функций выполняются с помощью соглашения о вызове Windows x64.

+0

+1 и принято спасибо Дэвид, не был уверен, это правда для всех версий delphi? – ComputerSaysNo

+1

True для всех версий. –

+0

потрясающий, спасибо! – ComputerSaysNo

Смежные вопросы