Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций РСОИ.doc
Скачиваний:
20
Добавлен:
04.11.2018
Размер:
1.93 Mб
Скачать

2.1.2. Створення dll у середовищі Delphi (експорт)

Ланцюжок File->New-> DLL Wizard приводить до створення нового проекту для DLL за таким шаблоном:

Library MyDLL;

uses

Sysutils, Classes, <модулі, що використовуються>;

<оголошення й описи функцій >

exports

<експортовані функції >

begin

<ініціалізаційна частина>

end.

Ім’я файла проекту для DLL має співпадати з назвою бібліотеки (в наведеному вище прикладі це ім’я має бути MyDLL.dpr).

Як і в програмі, у DLL є присутнім розділ uses. Він міcтить перелік модулів, які використовує сама DLL.

За розділом uses наводяться оголошення та реалізація функції або процедур, які складають DLL.

Загальний формат оголошення та реалізації методу, що експортується має такий вигляд:

Function ім’я_функції(параметри_функції):тип_функції; директива_виклику;

або

Procedure ім’я _процедури(параметри_процедури); директива_виклику;

Директива виклику визначає алгоритм за яким здійснюється передавання параметрів та режим використання стеку головної програми, а саме:

Директива виклику

Передавання параметрів

Режим очищення стеку

Register

(За замовчуванням)

 1,2,3

Той, хто викликає

Pascal

 1,2,3

Той, кого викликають

Stdcall

 1,2,3

Той, хто викликає

Сdecl

 3,2,1

Той, хто викликає

safecall ( СОМ технологія)

 3,2,1

Той, хто викликає

У розділі exports перелічуються функції або процедури, доступ до яких здійснюється із зовнішніх застосунків.

Експортування функцій (і процедур) може виконуватися декількома способами:

  • за номером (індексом);

  • за іменем.

Залежно від цього використовується різний синтаксис:

exports

{експорт за індексом}

ExpFunc1 index 10;

{експорт за іменем}

ExpProc1 name 'MYEXPORTPROC';

{ім'я для експорту може не збігатися з ім'ям функції !}

Якщо в секції exports функції оголошуються в такий спосіб:

exports

MyExportFunc1,

MyExportFunc2;

то індексування експортованих функцій буде зроблене Delphi автоматично, а такий експорт буде вважатися експортом за іменем, що збігається з ім’ям функції. Тоді оголошення імпортованої функції у застосунку має збігатися з оголошенням функції в DLL, тобто мати те саме ім’я.

Завдяки тому, що у Windows існує поняття «резидентних функцій» DLL, тобто тих функцій, що перебувають в пам’яті протягом усього часу існування DLL у пам’яті, у Delphi існують засоби для організації і такого роду експорту:

exports

ExportByName name 'MYEXPORTPROC' resident;

Відзначимо той факт, що пошук функцій, експортованих за індексом, виконується швидше, ніж при експорті за іменем. З іншого боку, експорт за іменем зручніший, особливо якщо набір експортованих з DLL функцій періодично доповнюється, тому що не потребує стеження за дотриманням унікальності і відповідності індексів.

Секція ініціалізації (begin... end) є необов’язковою та містить код, який виконується першим при звертанні до DLL.

Створення процедури зворотного виклику. Під час завантаження DLL завжди викликається системна процедура _InitDll, яка зберігає стан регістрів, завантажує DLL, отримує зі стеку парамери та перевіряє системну змінну процедурного типу DLLProc. Реалізацію такої процедури виконує (за бажанням) розробник DLL. Процедура має один параметр із значенням:

DLL_PROCESS_DETACH = 0 − відключення,

DLL_PROCESS_ATTACH = 1 − перше підключення,

DLL_THREAD_ATTACH = 2 − підключення в новому потоці,

DLL_THREAD_DETACH = 3 − відключення в наявному потоці.

Приклад використання процедури

Library

//Функції для користувача

exports

//таблиця експорту

procedure DLLEntryPoint(reason:Integer);

begin

case reason of

1:Sowmessage('DLL завантажується вперше ');

1:Sowmessage('DLL виключається ');

2:Sowmessage('Створено новий потік');

3:Sowmessage('Знищено потік');

end;

end;

begin

// ініціалізація процедури зворотного виклику

DLLProc:= DllEntryPoint;

end.

Наведена процедура зветься процедурою зворотного виклику системного рівня.