Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава VI Модули.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
61.44 Кб
Скачать

Типы модулей в Delphi

Наиболее распространённым типом модуля в Delphi является форма – модуль со связанным с ним окном. Интерфейсная часть такого модуля обычно содержит объявление нового класса и автоматически обновляется Delphi в ходе конструирования окна. В интерфейсной части модуля – формы содержится также объявление объекта для соответствующего оконного класса. Например, в нашем случае объявления класса TfmExample и объекта fmExample.

Помимо форм в репозитории содержатся также не связанные с видимыми окнами модули. К ним относятся модули данных, модули динамических библиотек, пакеты и модули потоков.

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

Модули динамических библиотек предназначены для создания широко используемых в Windows динамически связанных библиотек DLL (Dynamic – Link Libraries).

DLL служат универсальным средством согласования подпрограмм, написанных на разных языках программирования. В Windows содержится множество DLL, написанных на языке Си или на языке ассемблера, которые можно использовать в Delphi. Модули динамических библиотек предназначены для разработки DLL с помощью Object Pascal. Такие DLL затем смогут использовать программы, созданные с помощью других языков программирования.

Пакеты - это особым образом откомпилированные DLL, оптимизированные для совместного использования Delphi-программами или средой Delphi. В отличие от DLL, пакеты могут хранить и передавать программе типы (включая классы) и данные. Например, в пакете VCL-40 содержатся основные компоненты Delphi.

Модули потоков предназначены для реализации так называемых потоков команд (данных) – фрагментов программы (данных), которые используются параллельно с другими фрагментами, разделяя с ними время процессора и остальные системные ресурсы.

Особенности разработки DLL

DLL реализуется в виде исполняемых модулей, содержащих готовые к работе процедуры, функции и/или ресурсы. Есть много общего между DLL и обычными для Object Pascal модулями Unit. Но есть и принципиальные отличия. Главным из них является то, что DLL не в состоянии поставлять в программу переменные, константы и типы, так как создатели DLL могут использовать не типизированные языки программирования, например, язык ассемблера. Для этого используются пакеты.

Другим важным отличием является способ связывания экспортируемых программ с основной программой. Модули связываются с программой на этапе компоновки, т.е. статически. Если загружены две программы, использующие одни и те же модули, в памяти будут два экземпляра одинаковых фрагментов кода. В отличие от этого DLL подключаются к программе в момент её использования, т.е. динамически. Если, опять же, две программы используют одну и ту же DLL, в памяти будет лишь один экземпляр разделяемого программами кода.

Для создания DLL в Object Pascal введено зарезервированное слово Library, которым должен начинаться текст библиотеки. За словом Library следует правильный идентификатор, но в отличие от объявления модуля, он не обязан совпадать с именем файла: имя DLL определяется именем DLL-файла, а не идентификатором, следующим за Library.

Структура текста DLL повторяет структуру обычной программы с тем исключением, что раздел исполняемых операторов в DLL играет ту же роль, что и инициирующая часть модуля; операторы этой части исполняются только один раз в момент загрузки библиотеки в память. Каждое очередное обращение с требованием загрузить библиотеку наращивает её счётчик ссылок, но не приводит к выполнению операторов исполняемой части.

Сразу за заголовком экспортируемой подпрограммы должно следовать зарезервированное слово Export, которое заставит компилятор выработать специальный код «пролог-эпилог», который позволяет DLL-программе использовать сегмент стека вызывающей её программы.

В разделе описаний помимо стандартных для обычной программы объявлений используется специальный раздел объявлений экспортируемых программ. Этот раздел начинается зарезервированным словом Exports, за которым через запятую перечисляются имена экспортируемых подпрограмм, например:

Library MyLibrary;

Function MyFunc (….): ….; Export;

begin

  • - -

End;

Procedure MyProc; Export;

begin

  • - -

end;

Exports

MyFunc, MyProc;

begin

END.

Помимо имени подпрограммы в заголовок DLL помещается присвоенный ей целочисленный индекс. Это позволяет вызывающей программе ссылаться не на имя, а на индекс подпрограммы и тем самым уменьшить затраты времени на установление с ней связи. Индекс присваивается подпрограмме по порядку её появления в списках Exports.

Во избежание возможной путаницы рекомендуется задавать индексы всем экспортируемым подпрограммам.