
Типы модулей в 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.
Во избежание возможной путаницы рекомендуется задавать индексы всем экспортируемым подпрограммам.