Настройка параметров проекта
Установить параметры проекта можно двумя способами:
• в окне Project Options,
• программно.
Проще всего воспользоваться окном задания параметров объекта, которое открывается командой Project|Options. На странице Forms можно назначить главную форму приложения и в списке Auto-create forms выбрать формы, которые будут создаваться одновременно с главной. Главная форма открывается первой, и её закрытие приводит к закрытию всего приложения.
На странице Application задают название и иконку, которые будут отображаться в среде Windows на панели задач, а также файл справки, подключаемый к проекту. На страницах Compiler и Linker устанавливают директивы компилятора и компоновщика (редактора связей).
Заданные параметры Delphi автоматически заносит в соответствующие файлы проекта.
Программное задание параметров (использованием свойств объекта Application или включением в код директив компилятора и компоновщика) обладает приоритетом.
Компиляция и выполнение проекта
Компиляция проекта выполняется командой Project|Compile ProjectName или использованием комбинации клавиш Ctrl+F9. При этом компилируются все исходные модули, содержимое которых изменялось после последней компиляции: для каждого программного модуля создаётся файл с расширением dcu. Затем компилируется файл проекта и компонуется (собирается) из dcu-модулей исполняемый файл, имя которого совпадает с именем файла проекта. Готовый к использованию файл может быть приложением (*.exe) или динамически загружаемой библиотекой (*.dll).
Выполнить компиляцию можно на любой стадии разработки проекта. Так как в процессе компиляции проверяется синтаксис программы, то рекомендуется при формировании кода выполнять эту операцию регулярно.
Кроме обычной компиляции, можно командой Project|Build ProjectName выполнить сборку (построение) проекта. В этом случае перекомпилируются все модули проекта, для которых доступны исходные тексты.
Готовый проект можно запустить на выполнение в среде Delphi либо в среде Windows. Выполнение приложения из среды Delphi задаётся командой Run|Run (клавишей F9 или кнопкой с зелёным тругольником) и имеет следующие особенности:
• нельзя запустить несколько копий приложения;
• при возникновении исключительных ситуаций сначала выводятся сообщения Delphi, а затем – приложения;
• для аварийного завершения приложения (например, при зацикливании) необходимо выполнить команду Run|Program Reset;
• для продолжения разработки проекта приложение надо закрыть.
DLL
Dll – универсальный механизм интеграции процедур и функций на других языках программирования. Не может поставлять переменные, константы, типы, т.к. уществуют и не типизированные языки программирования. Не экспортирует объекты.
Применение динамических библиотек позволяет добиться ряда преимуществ:
уменьшается размер исполняемого файла приложения и занимаемые им ресурсы;
функции DLL могут использовать несколько процессов одновременно;
управление динамическими библиотеками возлагается на операционную систему;
внесение изменений в DLL не требует перекомпиляции всего проекта;
одну DLL могут использовать программы, написанные на разных языках.
способа связывания не статический, без двух одинаковых фрагментов памяти – подключается динамически и всего 1 экземпляр кода в оп.
В отличие от модуля, имя не обязано совпадать с именем файла. Имя определяется именем файла, а не идентификатором за Library <ID>.
Для создания DLL введено зарез.слово Library, закоторым следует ID, но в отличие от объявления модуля он не обязан совпадать с именем файла: имя DLL определяется именем DLL-файла, а не идентификатором, следующим за Library.
Структура текста DLL повторяет структуру обычной программы с тем исключением, что повторное обращение к библиотеке не выполняет часть инициализации, просто счетчик ссылок увеличивается на 1.
Сразу за заголовком экспортируемой подпроги должно следовать зарез. слово export, заставляющее компилятор вырабатывать код пролога/эпилога
DLL имеют сегменты кода и данных, но у них нет сегмента стека. Специальный пролог/эпилог позволяет DLL— подпрограмме использовать сегмент стека вызвавшей ее программы.
В разделе описаний DLL могут объявляться типы (в том числе и объекты), константы и переменные, но они остаются скрытыми от вызывающей программы и могут использоваться только внутри DLL.
В разделе описаний помимо стандартных для обычной программы объявлений используется специальный раздел объявления экспортируемых подпрограмм. (Exports, за которым через запятую перечисляются имена экспортируемых подпрограмм, м несколько, но все должно быть заранее объявлено)
Помимо имени подпрограммы в заголовок DLL помещается также ее порядковый номер, точнее присвоенный ей целочисленный индекс, что позволяет вызывающей программе ссылаться не на имя, а на индекс подпрограммы и тем самым уменьшить затраты времени на установление с ней связи. Индекс присваивается подпрограмме либо по порядку ее появления в списках Exports' (с 0), либо указанием MyFunc index (1 до 32767). Программист может определить внешнее имя экспортируемой подпрограммы отличным от ее настоящего имени. Для этого в списке Exports добавляется слово name и внешнее имя в апострофах (ВЕРХНИЙ РЕГИСТР ТОЛЬКО!)
При вызове по имени программа просматривает имена в таблице имен в поисках нужного, что существенно медленнее, чем процесс поиска индекса. Затраты времени на поиск можно заметно сократить, если указать в списке Exports слово resident, Информация о подпрограмме, экспортируемой с признаком resident, сохраняется в памяти во все время использования библиотеки. (MyFunc index 1 name 'NEWFUNC' resident;)
Не компилируется в режимах build, make
Для использование подпрограмм из DLL необходимо описать их как внешние, добавив за словом External имя библиотеки в апострофах:
Procedure MyProc; Far; External 'MyDLL';
Если нужно сослаться на индекс подпрограммы, за именем библиотеки указывается слово index и индекс:
Procedure MyProc; Far; External 'MyDLL' index 2;
В этом случае имя, под которым подпрограмма будет известна программе, может не совпадать с ее внешним DLL— именем. Впрочем, программист может и явно переопределить имя подпрограммы, даже если он ссылается на ее внешнее имя:
Procedure MyProc; Far; External 'MyDLL' Name 'ExtName';
Описанный выше способ связывания DLL с основной программой называется статическим, т.к. он реализуется компилятором и компоновщиком (библиотеки в память одновременно с загрузкой самой программы)
Программа может загружать DLL и самостоятельно (динамически) с помощью трех функций, входящих в модуль WinAPI: LoadLibrary, CetProcAddress и FreeLibrary.
Var
Handle: Word;
Add, Sub, Mul, CDiv: TComplexProc;
begin
{Загружаем библиотекуCOMPLEX.DLL) Handle:= LoadLibrary('COMPLEX.DLL');
if Handle = 0 then begin
WriteLn('He найдена библиотека COMPLEX.DLL');
Halt end;
{Определяем адреса процедур. Первую вызываем по индексу, четвертую - по имени. При вызове по индексу младшее слово PChar должно содержать индекс,
поэтому делаем приведение типов}
@Add := GetProcAddress(Handle,PChar(Longint(1)));
@CDiv := GetProcAddress(Handle,'CmplxDiv');
{После использования удаляем библиотеку из памяти} FreeLibrary(Handle):
