
- •1. Определение системного программного обеспечения.
- •1. Ретроспектива развития спо.
- •2. Windows-динамически вызываемые библиотеки.
- •2. Характеристика системы прерывания.
- •Прерывания и способы их обработки
- •Драйверы устройств
- •2. Режимы пакетной обработки и разделения времени.
- •1. Принципы работы компилятора.
- •1. Принципы работы интерпретатора.
- •2. Программные прерывания.
- •2. Общая структура системы прерывания.
- •1. Объектный модуль.
- •1. Загрузочный модуль.
- •1. Перемещаемая объектная программа.
- •2. Программный и аппаратный таймер в пк.
- •1. Редактирование связей.
- •2. Общая постановка задачи управления памятью.
- •2. Мультипрограммные режимы и разделение памяти.
- •1. Загрузка программы.
- •2. Многозадачность и многопоточность.
- •2. Физическая и логическая структура памяти.
- •2. Таблица fat.
- •2. Управление файлами.
- •1. Подсистема ввода/вывода.
- •2. Графические файлы. Файлы bmp
2. Windows-динамически вызываемые библиотеки.
Динамически компонуемые библиотеки (DLL) позволяют несколь-
ким прикладным программа Windows или DOS защищенного режима сов-
местно использовать код и ресурсы. В Borland Pascal вы можете как
использовать существующие DLL, так и написать свои собственные
DLL, которые можно применять в других программах.
Что такое DLL?
DLL - это выполняемый модуль, содержащий программный код или
ресурсы, используемые другими прикладными программами или DLL.
Концептуально динамически компонуемая библиотека аналогичная мо-
дулю - они обеспечивают для программ процедуры и функции. Однако
между DLL и модулями имеются существенные различия. В частности,
модули компонуются статически, а DLL - динамически.
Когда программа использует процедуру или функцию из модуля,
копия кода этой процедуры или функции статически компонуется с
выполняемым файлом программы. Если две программы выполняются од-
новременно и используют одну и ту же процедуру и функцию модуля,
то в системе будет присутствовать две копии этой подпрограммы.
Эффективнее было бы использовать одну копию. Такую возможность
предоставляет DLL.
В отличие от модуля DLL не компонуется с использующей DLL
программой. Вместо этого код и ресурсы DLL находятся в отдельном
выполняемом файле с расширением .DLL. Этот файл должен присутс-
твовать при выполнении программы-клиента. Вызываемые программой
процедуры и функции динамически компонуются со своими точками
входа в используемой программе DLL.
Другое отличие модулей от DLL состоит в том, что модули мо-
гут экспортировать типы, константы, данные и объекты, а DLL -
только процедуры и функции.
Чтобы ее можно было использовать в программе Borland Pascal,
DLL не обязательно должна быть написана на Borland Pascal. Кроме
того, программы, написанные на других языках, могут использовать
DLL, написанные на Borland Pascal. DLL, таким образом, идеально
подходит при программных проектах, реализуемых на нескольких язы-
ках.
Использование DLL
Чтобы модуль мог использовать процедуру или функцию в DLL,
он должен импортировать процедуру или функцию с помощью описания
external. Например, в следующем описании из DLL и именем KERNEL
(ядро Windows) импортируется функция с именем GlobalAlloc:
function GlobalAlloc(Glags: Word; Bytes: Longint): THandle;
far; external 'KERNEL' index 15;
В импортируемой процедуре или функции директива external за-
нимает место описательной и операторной части, которые нужно было
бы включить в противном случае. В импортируемых процедурах и
функциях должна использоваться дальняя модель вызова, выбранная
ключевым словом far или директивой компилятора {$F+}; во всем ос-
тальном их поведение не отличается от обычных процедур и функций.
Borland Pascal импортирует процедуры и функции тремя спосо-
бами:
- по имени;
- по новому имени;
- по порядковому номеру.
Формат директив external для каждого из трех методов показан
в приведенном ниже примере.
Когда оператор index или name не указан, процедура или функ-
ция экспортируются по имени. Это имя совпадает с идентификатором
процедуры или функции. В данном примере процедура ImportByName
импортируется из библиотеки 'TESTLIB' по имени 'IMPORTBYNAME':
procedure ImportByName; external 'TESTLIB';
Когда задан оператор name, процедура или функция импортиру-
ется под именем, отличным от имени идентификатора. В следующем
примере процедура ImportByName импортируется из библиотеки
'TESTLIB' по имени 'REALNAME':
procedure ImportByName; external 'TESTLIB'name 'REALNAME'
Наконец, при наличии оператор index процедура или функция
импортируется по порядковому значению. Такой вид импорта уменьша-
ет время загрузки модуля, так как отпадает необходимость поиска
имени в таблице имен DLL. В следующем примере процедура
ImportByOrd импортируется из библиотеки 'TESTLIB':
procedure ImportByOrd; external 'TESTLIB' index 5;
Имя DLL задается после ключевого слова external, а новое
имя, заданное в операторе name, не обязано представлять собой
строковые литералы. Допускается любое строковое выражение-конс-
танта. Аналогично, порядковый номер, задаваемый в операторе
index, может быть любым целочисленным выражением-константой.
const
TestLib = TestLib;
Ordinal = 5;
procedure ImportByName; external TestLib;
procedure ImportByName; external TestLibname 'REALNAME'
procedure ImportByOrd; external TestLib index Ordinal;
Хотя DLL может содержать переменные, импортировать их в дру-
гие модули невозможно. Любой доступ к переменным DLL должен осу-
ществляться через процедурный интерфейс.
5
1. Задачи системных программистов и системных операторов.
2. Особенности программирования в Windows.
6
1. Определение и виды метапрограмм.