7.1.1. Объявление внешних функций и процедур

На верх  Назад  Вперёд

Первый шаг, который вы должны сделать для использования внешних блоков кода – это объявление функции, которую вы хотите использовать. Free Pascal поддерживает синтаксис Delphi, то есть вы можете использовать директиву external. Директива external по сути заменяет блок кода функции.

Директива external не определяет соглашение о вызовах. Она только указывает компилятору, что код процедуры или функции размещён во внешнем блоке кода. Модификатор соглашения о вызовах должен быть объявлен, если внешний блок кода не имеет не соответствует соглашениям о вызовах Free Pascal. Более подробную информацию о соглашениях о вызовах можно найти в разделе 6.3. Механизм вызова.Существует четыре варианта директивы external:

1.Простое объявление внешней подпрограммы:

Procedure ProcName (Args : TPRocArgs); external;

Директива external указывает компилятору, что функция размещена во внешнем блоке кода. Вы можете использовать её вместе с директивами {$L} или {$LinkLib} для компоновки функции или процедуры в библиотеке или внешнем объектном файле. Объектные файлы просматриваются в путях поиска объектов (устанавливается при помощи -Fo), а библиотеки ищутся в путях компоновщика (устанавливаются при помощи -Fl).

2.Вы можете передать в директиву external имя библиотеки как аргумент:

Procedure ProcName (Args : TPRocArgs); external ' Name';

Это укажет компилятору, что процедура размещена в библиотеке с именем «Name». Этот способ эквивалентен следующему:

Procedure ProcName (Args : TPRocArgs);external;{$LinkLib 'Name'}

3.Директива external может также использоваться с двумя аргументами:

Procedure ProcName (Args : TPRocArgs); external 'Name' name 'OtherProcName';

Это имеет такое же значение, как и в предыдущем объявлении, только компилятор будет использовать имя «OtherProcName» при компоновке библиотеки. Это можно использовать для получения различных имён для процедур и функций во внешней библиотеке. Имя процедуры чувствительно к регистру и должно точно совпадать с именем программы в объектном файле.

Этот способ эквивалентен следующему коду:

Procedure OtherProcName (Args : TProcArgs); external;
{$LinkLib 'Name'}
Procedure ProcName (Args : TPRocArgs);
begin
  OtherProcName (Args);
end;

4.Наконец, под WINDOWS и OS/2 имеется четвёртый способ определить внешнюю функцию: в файлах .DLL, где функции также имеют уникальный номер (их индекс). Можно ссылаться на эти функции, используя их индекс:

Procedure ProcName (Args : TPRocArgs); external 'Name' Index SomeIndex;

Это указывает компилятору, что процедура ProcName расположена в динамической библиотеке и имеет индекс SomeIndex.

ПРИМЕЧАНИЕ

Учтите, что это доступно только под WINDOWS и OS/2.