stdcall требуется для функции импорта? - PullRequest
4 голосов
/ 21 марта 2012

Мне интересно это:

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

1 Ответ

10 голосов
/ 21 марта 2012

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

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

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

...