На этом шаге мы рассмотрим правила описания экспортируемых подпрограмм.
Подразделы описания экспортируемых имен exports могут многократно встречаться в любом месте описательной части программы или динамически связываемой библиотеки (DLL). Каждая запись в предложении exports задает идентификатор экспортируемой процедуры или функции. При этом необходимо следить, чтобы эта процедура или функция была описана до указания ее имени в подразделе exports. Кроме того, описание экспортируемой процедуры или функции должно содержать директиву export (без буквы "s" в конце!). В качестве экспортируемых имен могут выступать уточненные идентификаторы.
В подразделах описаний exports перечисляются все процедуры и функции, которые экспортируются данной программой или динамически связываемой библиотекой. Заметим, что хотя программа может содержать предложение exports, однако на практике это встречается достаточно редко. Как правило, оно указывается в DLL. Предложения exports допускаются только во внешнем разделе описаний программы или DLL. В разделе описаний процедуры, функции и модуля они использоваться не могут.
Описание подраздела экспортируемых имен начинается с зарезервированного слова exports, за которым следует список записей экспорта, разделенных запятыми. Одна запись экспорта в простейшем случае представляет собой просто экспортируемый идентификатор.
Каждая запись экспорта может включать в себя стандартную директиву index, за которой следует целочисленное значение в диапазоне от 1 до 32767. Число, указанное в index, ставит в соответствие экспспортируемой процедуре или функции специальное порядковое значение. Если в записи экспорта описание index отсутствует, то порядковое значение присваивается автоматически.
Запись экспорта также может содержать стандартную директиву name, за которой следует строковая константа. Эта константа задает процедуре или функции имя, с которым она будет экспортироваться. Если описание name отсутствует, то процедура или функция экспортирует со своим идентификатором.
Кроме того, запись экспорта может включать в себя стандартную директиву resident, при указании которой информация об экспорте будет оставаться в оперативной памяти, пока DLL загружена. Это позволяет существенно уменьшить время поиска подпрограммы в динамически загружаемой библиотеке по имени.
Пример:
exports Subroutine1 index 1, Subroutine2 index 2 name 'SUB2' , Subroutine3 index 3 resident;
На следующем шаге мы рассмотрим описание поточно-локальных переменных.