Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi.pdf
Скачиваний:
191
Добавлен:
24.02.2016
Размер:
6.84 Mб
Скачать

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

5.2.4. Пример библиотеки

Вооруженные теорией, приступим к практике — разработаем какую-нибудь полезную библиотеку, а затем подключим ее к своей программе. На этом примере мы покажем вам, как оформляется динамически загружаемая библиотека, составленная из нескольких программных модулей.

Шаг 1. Запустите

систему Delphi и

выберите в меню

команду

File | New | Other... .

В диалоговом окне,

которое откроется на

экране,

выберите значок с подписью DLL Wizard и нажмите кнопку OK (рисунок

5.1):

Рисунок 5.1. Окно выбора нового проекта, в котором выделен пункт DLL Wizard

Среда Delphi создаст новый проект со следующей заготовкой библиотеки:

library Project1;

{ Important note about DLL memory management ... }

uses

224

SysUtils,

Classes;

begin end.

Шаг 2. С помощью команды File | New | Unit создайте в проекте новый программный модуль. Его заготовка будет выглядеть следующим образом:

unit Unit1;

interface

implementation

end.

Шаг 3. Сохраните модуль под именем SortUtils.pas, а проект — под именем SortLib.dpr. Прейдите к главному файлу проекта и удалите из секции uses модули SysUtils и Classes (они сейчас не нужны). Главный программный модуль должен стать следующим:

library SortLib;

{ Important note about DLL memory management ... }

uses

SortUtils in 'SortUtils.pas';

begin end.

Шаг 4. Наберите исходный текст модуля SortUtils:

unit SortUtils;

interface

procedure BubleSort(var Arr: array of Integer); stdcall; procedure QuickSort(var Arr: array of Integer); stdcall;

exports

BubleSort name 'BubleSortIntegers', QuickSort name 'QuickSortIntegers';

implementation

procedure BubleSort(var Arr: array of Integer); var

I, J, T: Integer; begin

225

for I := Low(Arr) to High(Arr) - 1 do for J := I + 1 to High(Arr) do

if Arr[I] > Arr[J] then begin

T := Arr[I]; Arr[I] := Arr[J]; Arr[J] := T;

end;

end;

procedure QuickSortRange(var Arr: array of Integer; Low, High: Integer); var

L, H, M: Integer; T: Integer;

begin

L := Low;

H := High;

M := (L + H) div 2; repeat

while Arr[L] < Arr[M] do L := L + 1;

while Arr[H] > Arr[M] do H := H - 1;

if L <= H then begin

T := Arr[L]; Arr[L] := Arr[H]; Arr[H] := T;

if M = L then M := H

else if M = H then M := L;

L := L + 1;

H := H - 1; end;

until L > H;

if H > Low then QuickSortRange(Arr, Low, H); if L < High then QuickSortRange(Arr, L, High);

end;

procedure QuickSort(var Arr: array of Integer); begin

if Length(Arr) > 1 then

QuickSortRange(Arr, Low(Arr), High(Arr));

end;

end.

В этом модуле процедуры BubleSort и QuickSort сортируют массив чисел двумя способами: методом «пузырька» и методом «быстрой» сортировки соответственно. С их реализацией мы предоставляем вам разобраться

226

самостоятельно, а нас сейчас интересует правильное оформление процедур для их экспорта из библиотеки.

Директива stdcall, использованная при объявлении процедур BubleSort и QuickSort,

procedure BubleSort(var Arr: array of Integer); stdcall; procedure QuickSort(var Arr: array of Integer); stdcall;

позволяет вызывать процедуры не только из программ на языке Delphi, но и из программ на языках C/C++ (далее мы покажем, как это сделать).

Благодаря присутствию в модуле секции exports,

exports

BubleSort name 'BubleSortIntegers', QuickSort name 'QuickSortIntegers';

подключение модуля в главном файле библиотеки автоматически приводит к экспорту процедур.

Шаг 5. Сохраните все файлы проекта и выполните компиляцию. В результате вы получите на диске в своем рабочем каталоге двоичный файл библиотеки SortLib.dll. Соответствующее расширение назначается файлу автоматически, но если вы желаете, чтобы компилятор назначал другое расширение, воспользуйтесь командой меню Project | Options… и в появившемся окне Project Options на вкладке Application впишите расширение файла в поле Target file extension (рисунок 5.2).

Рисунок 5.2. Окно настройки параметров проекта

227

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]