Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Статический и динамический импорт

Директива external обеспечивает возможность статического им-

порта процедур и функций из DLL. Статически импортируемая проце-

дура и функция всегда ссылается на одну и ту же точку входа в

DLL. Расширения Windows и защищенного режима DOS Borland поддер-

живает также динамический импорт, при котором имя DLL и имя или

порядковый номер импортируемой процедуры или функции задается во

время выполнения. Приведенная ниже программа ShowTime использует

динамический импорт для вызова процедуры GetTime в DATETIME.DLL.

Обратите внимание на использование переменной процедурного типа

для представления адреса процедуры GetTime.

program ShowTime;

uses WinProcs, WinTypes, WinCrt;

type

TTimeRec = record

Second: Integer;

Minute: Integer;

Hour: Integer;

end;

TGetTime = procedure(var Time: TTimeRec);

var

Time: TTimeRec;

Handle: THAndle;

GetTime: TGetTime;

begin

Handle := LoadLibrary('DATETIME.DLL');

if Handle >= 32 then

begin

@GetTie := GetProcAddress(Handle, 'GETTIME');

if @GetTime <> nil then

begin

GetTime(Time);

with Time do

WriteLn('Текущее время: ', Hour, ':', Minute, ':',

Second);

end;

FreeLibrary(Handle);

end;

end;

Написание dll

Структура DLL Borland Pascal идентичная структуре программы,

но DLL начинается вместо заголовка program с заголовка program.

Заголовок library указывает Borland Pascal, что нужно создать вы-

полняемый файл с расширением .DLL, а не с расширением .EXE, и вы-

полняемый файл помечается как DLL.

библиотека

¦

¦ -------------- ---- -------

L-->¦ заголовок +-->¦ ; +-T------------------¦ блок +------->

¦ библиотеки ¦ L---- ¦ ----------- ^ L-------

L-------------- L-->¦ оператор +--

¦ uses ¦

L-----------

---------- ----------------

заголовок ---->¦ library +-->¦ идентификатор +----->

процедуры L---------- L----------------

В приведенном ниже примере приведена очень простую DLL с

двумя экспортируемыми функциями Min и Max, которые вычисляют наи-

меньшее и наибольшее из двух целочисленных значений.

library MinMax;

function Min(X, Y: Integer): Integer; export;

begin

if X < Y then Min := X else Min := Y;

end;

function Max(X, Y: Integer): Integer; export;

begin

if X > Y then Max := X else Max := Y;

end;

exports

Min index 1,

Max index 2;

begin

end.

Обратите внимание на использование для подготовки Min и Max,

для экспорта ключевого слова export, и на оператор exports, ис-

пользуемый для фактического экспорта двух подпрограмм, указываю-

щий, для каждой из них, необязательный порядковый номер.

Хотя предыдущий пример этого не показывает, библиотека может

состоять из нескольких модулей. В таких случаях исходный файл

библиотеки часто сводится к оператору uses, оператору exports и

коду инициализации библиотеки. Например:

library Eritors;

uses EdInit, EdInOut, EdFormat, EdPrint;

exports

InitEditors index 1,

DoneEditors index 2,

InsertText index 3,

DeleteSelection index 4,

FormatSelection index 5,

PrintSelection index 6,

.

.

.

SetErrorHandler index 53;

begin

InitLibrary;

end.

Соседние файлы в предмете Программирование на Pascal