Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр ЯП 1 часть.docx
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
53 Кб
Скачать
☆

Настройка параметров проекта

Установить параметры проекта можно двумя способами:

• в окне 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):