Лекція 11 динамічно зв'язувані бібліотеки — Dynamically Linked



Скачати 74.17 Kb.
Дата конвертації30.12.2016
Розмір74.17 Kb.
ЛЕКЦІЯ 11
ДИНАМІЧНО ЗВ'ЯЗУВАНІ БІБЛІОТЕКИ
Динамічно зв'язувані бібліотеки — Dynamically Linked Libraries (DLL) — надають прикладним програмам додаткові можливості при роботі в захищеному режимі DOS і в режимі Windows. Окрім використання стандартних DLL, розроблених фірмами виробниками програмного забезпечення, Borland Pascal дозволяє програмістам писати власні DLL, які згодом можна використовувати разом із стандартними.

Спочатку динамічно зв'язувані бібліотеки використовувалися в оболонці Windows. Borland Pascal надав можливість розробляти DLL також і для захищеного режиму DOS.

Цінність бібліотек DLL полягає в тому, що вони після завантаження в оперативну пам'ять можуть спільно використовуватися декількома прикладними програмами. Хоча DLL для DOS працюють в захищеному режимі DOS, але разом з тим вони є повністю сумісними з DLL для Windows. Ця властивість дозволяє розробникам створювати програми що працюють як в DOS, так і в Windows.

DLL підтримують "багатомовні" проекти в програмах, написаних на мові Borland Pascal, де допускається використання DLL, створених на інших мовах, а в програмах, написаних на інших мовах, допускається використання DLL, створених на Borland Pascal.

Синтаксис опису динамічно зв'язуваної бібліотеки має наступний вигляд:
Бібліотека заголовок бібліотеки;

USES


блок

розділ експорту

розділ ініціалізації.
Мовна конструкція "динамічно зв'язувана бібліотека" з одного боку є продовженням і розвитком конструкції "модуль", а з іншого боку має деякі обмеження в порівнянні з нею.

Особливості DLL полягають в наступних відмінностях:

компоновка модулів з головною програмою виконується статично під час компіляції, а DLL — динамічно, під час виконання програми. Це дозволяє для декількох одночасно працюючих програм тримати у оперативній пам'яті тільки по одній копії процедур і функцій, використовуваних в кожній з них;

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

| обмеженість DLL в порівнянні з модулями полягає в тому, що модулі можуть експортувати різні мовні одиниці (типи, константи, змінні і так далі), а DLL тільки процедури і функції. Хоча DLL може містити змінні, проте модулі не зможуть імпортувати їх для використання. Будь-який доступ до змінних DLL повинен здійснюватися через процедурний інтерфейс;

| при запуску створеної користувачем програми на компіляцію, DLL, використовувані в ній автоматично, не компілюються як модулі. DLL потрібно компілювати окремо.


СТВОРЕННЯ ДИНАМІЧНО ЗВ'ЯЗУВАНИХ БІБЛІОТЕК
Як видно з наведеного вище синтаксису динамічно зв'язуваної бібліотеки, її структура практично така ж, як і структура програми. Відмінність полягає тільки в тому, що в заголовку замість ключового слова program записується ключове слово library. Це слово указує компілятору, що потрібно створити виконуваний файл динамічно зв'язуваної бібліотеки, який повинен мати розширення .DLL, а не .ЕХЕ.

Наприклад:

UNIT COMMON; { модуль загальних описів}

Inteface;

Const L=100;

Type T_Vector= arrag [1.L] of integer;

Inplementation;

End.
Library Vector;

USES CRT, COMMON;

Var


i: byte; Procedure PRINVECT (Vect: T_Vector; N: byte);
Begin

Write (‘елементи вектора’);

For i: =1 to N do write (vect [i]: 5);

Writeln;


End;

Procedure VECT_MAX (Vect: T_Vect; N: byte); export;

Var

max: integer



I: byte;

Begin


Max: = Vect [1];

For i: =2 to N do

If vect [i]>m them max: =vect [i];

Clrscr;


PrintVect (Vect, N);

Writeln (‘максимальний елемент =’, max);

End;

Procedure Vect_Min (vect: T_Vector, N: byte); export;



Var

min: integer;

I: byte;

Begin


Min: = Vect [1];

For i: =1 to N do

If vect [i]

Clrscr;


Print Vect (Vect, N);

Writeln (‘ мінімальний елемент рівний =’, min);

End;

Exports


Vect max index 1;

Vect min index 2;

End.
У описі динамічно зв'язуваних бібліотек важлива роль належить exports і процедурній директиві export, яка указується в заголовках що експортуються із створюваної DLL процедур і функцій.

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

Оператори розділу ініціалізації виконуються, як і у модуля, однократно, але не при запуску програми, а при первинному завантаженні бібліотеки. Для визначення потреби знаходження DLL, в оперативній пам'яті служить, так званий лічильник використання DLL.
Для кожної DLL встановлюється свій лічильник використання DLL, який показує, скільки програм в даний момент часу її використовують. Динамічно зв'язувана бібліотека після завантаження зберігається в пам'яті до тих пір, поки її лічильник використання більше нуля. Коли всі прикладні програми, використовуючі DLL, закінчать роботу, значення лічильника її використання стає нульовим і DLL віддаляється з пам'яті. Якщо яку-небудь вже завантажену DLL починає використовувати ще одна програма, лічильник її використання збільшується, а оператори розділу ініціалізації повторно не виконуються.
ІМПОРТ ПРОЦЕДУР І ФУНКЦІЙ З DLL
Програми і модулі, написані на мові Borland Pascal можуть імпортувати процедури і функції з DLL трьома способами:

1. По імені.

2. По новому імені.

3. По порядковому номеру.


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

| повинна використовуватися процедурна директива external;

| ім'я DLL указується після директиви external;

| повинна використовуватися дальня модель виклику, встановлена процедурною директивою far або {$F+}.


Імпорт по імені

Імпорт процедури або функції по її власному імені (ідентифікатору) виконуватиметься в тому випадку, якщо в описі її заголовка відсутні директиви index і паті.

Наприклад

Procedure proc; externaldemo’;

У цьому описі процедура proc імпортується з динамічно зв'язуваної бібліотеки demo по своєму власному імені proc.


Імпорт по новому імені

Якщо в заголовку процедури або функції вказана директива паті, то вона буде імпортована не по своєму імені, а по імені, вказаному в паті. Наприклад



Procedure proc; externaldemo’ name ‘new’;

У цьому описі процедура proc імпортується з динамічно зв'язуваної бібліотеки demo не по своєму власному імені proc, а по новому імені new. Як нове ім'я допускається будь-який строковий вираз-константа.


Імпорт по порядковому номеру

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


Наприклад

Procedure Vect_Max; external ‘Vector’ index 1;

Таке імпортування зменшує час завантаження модуля, оскільки не шукається ім'я у списку імен DLL.

{Повинна використовуватися дальня модель виклику встановлена директивою Far і директивою команди {$F+}.

Приклад програми, використовуючою DLL.
Program Main;

Uses Crt, Common;

Var

V: T_Vector;



I, N: byte;

Procedure VECT_MAX (Vect: T_Vect; N: byte); external ‘VECTOR’;

Procedure Vect_Min (vect: T_Vector, N: byte); external ‘VECTOR’;

Begin


Clrscr;

Writeln (‘введіть довжину масиву’);

Readln (N);

Writeln (‘введіть елементи масиву’);

For i: =1 to N do read (V [i]);

Vect_Max(V,N);

Vect_Min(V,N);

End.


Модулі імпорту

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


ЗОНА ДІЇ ЗМІННИХ В DLL.

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


База даних захищена авторським правом ©lecture.in.ua 2016
звернутися до адміністрації

    Головна сторінка