Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Interface

End.

Begin

Структура DLL- библиотеки.

Динамически загружаемые библиотеки (DLL).

Лекция 28

DLL позволяют ядру Windows, наряду с гибким управлением памятью, использовать минимальный объем памяти для выполнения программы. В отличие от традиционного подхода, когда подпрограммы, используемые программой, подключаются к ней статически при компоновке программы, в среде Windows подпрограммы из DLL подключаются динамически, то есть в процессе выполнении программы, причем несколько, одновременно выполняющихся программ могут использовать одну и туже копию подпрограммы из DLL.

Библиотека DLL - это специальным образом оформленная программная единица, предназначенная для хранения подпрограмм (функций и процедур) и ресурсов (например, форм). DLL библиотека формируется и компилируется независимо от использующих ее программ. В самих программах указываются только обращения к подпрограммам.

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

Library имя; - заголовок библиотеки;

Uses раздел модулей;

Label.........; Раздел меток;

Const.........; Раздел констант;

Type..........; Раздел типов;

Var...........; Раздел переменных;

.......

....... Раздел подпрограмм;

Exports раздел экспортирования подпрограмм;

........ секция инициализации;

Правила записи разделов DLL- библиотеки такие же, как и в случае программы на ТР.

После раздела модулей могут располагаться разделы описания типов, констант, переменных. Например, если в списке формальных параметров подпрограммы есть массив, то необходимо в библиотеке предусмотреть раздел Type и объявить в нем идентификатор типа массива.

Раздел экспортирования предназначен для указания подпрограмм, которые можно передавать в другие программы. Из DLL- библиотеки можно экспортировать только подпрограммы, имена которых указаны в разделе Exports. Подпрограммы, имена которых не указаны в разделе Exports, можно использовать только внутри DLL-библиотеки.

Секция инициализации аналогична такой же секции модуля и выполняется один раз при загрузке библиотеки. Эта секция начинается с зарезервированного слова Begin и заканчивается словом End., в ней можно записывать операторы, выполняющие инициализацию параметров, открытие файлов и т.п.

Раздел Exports записывается в виде

Exports объявление 1, объявление 2,.... объявление n;

где объявление Х - задает характеристики конкретной экспортируемой подпрограммы. Есть несколько способов задания объявления.

1 способ. Объявление задается именем подпрограммы, например,

Exports Sum;

2 способ. Объявление задается именем и номером (с помощью директивы Index).

Пример. Exports Sum Index 1, Mult Index 2;

Этот способ является самым быстрым по вызову.

 

5.15.1. Создание DLL- библиотеки.

В Delphy имеются специальные средства для создания DLL библиотек.

Пример. Создадим DLL библиотеку содержащую две процедуры:

MX - определение максимального числа из V1 иV2;

PFY2 - вычисление значения функции У=А*Х*Х.

1. Выполнить команды File \ New - появится окно NewItem.

Выделим пиктограмму DLL и щелкнем по кнопке ОК.

Откроется окно с заготовкой DLL.

library Project1;

{ Комментарии }

uses SysUtils, Classes;

{$R *.RES}

 

begin

end.

 

2. Удалим комментарии и добавим в заготовку после директивы компилятора {$R *.RES} процедуры max и Pfy, а также укажем в разделе экспортирования объявление подпрограмм спомощью имени и номера. В результате получится текст:

 

Library Project1;

uses Sysutils,classes;

{$R *.RES}

Procedure max(v1,v2:Extended;

Var Z:Extended);

begin

If v1 > v2 Then Z:=v1

Else Z:=v2;

end;

 

Procedure Pfy(a,x:Extended;

Var Fy:Extended);

begin

Fy:=a*Sqr(x);

end;

 

Exports Max index 1,

Pfy index 2;

begin

End.

3. Сохраним проект под именем MyDLL.dll в отдельной папке.

4. Выполнить пункт меню Project \ Build Project. Выполнить компиляцию, исправить ошибки. При успешной компиляции в нашей папке появится файл MyDLL.dll.

 

5.15.2. Вызов Dll.

Под вызовом библиотеки понимается использование имеющихся в ней подрпограмм (процедур и функций) и ресурсов. При вызове библиотеки программист не имеет возможности указать ее размещение, поэтому библиотека должна быть расположена в папке, в которой Windows может обнаружить ее автоматически. Такими папками являются: корневая папка Windows, ее папки System и System, а также папка из которой запущено приложение.

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

При статическом вызове библиотека загружается в оперативную память вместе с использующими ее приложениями и другими библиотеками и выгружается после прекращения работы последнего использующего ее процесса. Достоинством статического вызова является простота реализации в программе. Однако при таком вызове программист не может управлять процессом загрузки библиотеки и, кроме того, библиотека находится в оперативной памяти все время работы приложения, даже если она не будет использована.

При динамическом вызове библиотечных функций программист может управлять процессом загрузки библиотек, а также экономить оперативную память, загружая только нужные в данный момент библиотеки. Например, если библиотека содержит форму для настройки приложения (и используется редко), то имеет смысл загружать ее только на время использования содержащихся в ней кода и ресурсов.

Рассмотрим статическое импортирование.

При статическом импортировании в секции implementation модуля формы задается заголовок импортируемой подпрограммы с директивой External. При вызове подпрограммы DLL библиотеки возможны два варианта:

а) вызов подпрограммы из библиотеки по имени, в этом случае после слова External записывается только имя библиотеки, например

Procedure Pfy(a,x:Extended; Var Fy:Extended); External ‘MyDLL.dll’;

 

б) вызов подпрограммы по ее номеру. Все подпрограммы в библиотеке пронумерованы. И по номеру можно вызвать соответствующую подпрограмму. Для этого после директивы External и имени библиотеки записывается директива Index и номер подпрограммы, например, так

 

Procedure Pfy(a,x:Extended; Var Fy:Extended); External ‘MyDLL.dll’ Index 3;

 

Это самый быстрый вызов. При статическом импортировании сама библиотека вызывается операционной системой при первом к ней обращении и выгружается, когда потребность в ней отпадает (когда программа прекратит свою работу, если только библиотека не используется в это время другими программами). Таким образом, в данном случае заботиться о загрузке и выгрузке библиотеки не требуется.

 

<== предыдущая лекция | следующая лекция ==>
Добавление формы | Процедура ShowMessage
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 329; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.