logo search
ОСиС-2014(Передача№1) / 1_ОперСистСети_ЛР_Методичка_2012 / ОС_ЛР-09-13-14 / LAB7 / LAB7

Синтаксис исходного текста dll

Исходный текст библиотеки DLL на языке Borland Pascal 8, используемом Delphi, чем-то напоминает исходный текст модуля (Unit) и выглядит следующим образом:

library <имя>; // вместо Program или Unit uses <обычный список используемых модулей>;

<Объявление процедур и функций>

exports Proc1 index 10, Proc2 name 'ProcedureTwo', Proc3, .....;

begin <возможные начальные установки, напр. - для глоб. переменных> end.

Стандартным образом, как для исполнимого модуля .EXE, в теле программы или в unit'ах описываются процедуры и данные.

Во фразе exports через запятую перечисляются идентификаторы экспортируемых, т.е. предназначенных для вызова внешними программами, процедур. Фраза exports может встречаться в тексте сколько угодно раз и перемежаться с объявлением процедур, единственное условие – процедура должна сначала объявляться, а затем экспортироваться. Рекомендуется объявлять экспортируемые процедуры с моделью вызова StdCall, гарантированно поддерживаемой трансляторами всех языков программирования для Windows. Экспортировать можно и процедуры из модулей.

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

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

DLL может содержать ресурсы, для их подключения используется все та же директива компилятора {$R}. Так как DLL является законченным исполнимым файлом, в отличие от модуля Unit, то ресурсы физически включаются в тело DLL.