Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
14.3 Mб
Скачать

3. Создание динамически подключаемых библиотек (dll)

Библиотеки DLL являются хранилищем различных компонентов (обычно процедур, функции и ресурсов). Вызов компонентов из библиотеки производится динамически при выполнении приложения по мере обращения к компонентам и не зависит от языка программирования. Это позволяет изменять компонент отдельно от приложения, не перетранслируя его, и использовать его в приложениях, написанных на других языках программирования C++, Visual Basic.

Пример создания библиотеки из двух функций Sum и Mult.

Выполним команду File/New/Dll. Сформируется заготовка, которую далее отредактируем, после строки {$R *.RES} вставим строки:

function Mult(x,y:double):double;

begin Result:=x*y; end; // произведение х*у

function Sum(x,y:double):double;

begin Result:=x+y; end; // сумма x+y

exports Sum, Mult; //список имен экспортируемых функций Sum, Mult

Сохраним проект под именем BSP и откомпилируем его (^F9), сформируется файл Bsp.Dll.

Внимание! Регистры букв в имени функции (в команде объявления функции в проекте) и в заголовке функции (в библиотеке) должны соответствовать.

В библиотеке можно хранить не только программы, но и ресурсы, например формы. Для примера создадим в проекте BSP форму (Form1) с надписью "Форма из BSP.DLL" и процедуру ShowFormDll (для создания и вывода формы Forml) вида:

procedure ShowFormDll(AOwnenTComponent); //заголовок процедуры

var F : TForm 1; //переменная типа TForm 1

begin F:=TForml.Create(AOwner); //создание формы

F.ShowModal; {вывод формы}

F.Free; {удаление формы}

end;

Дополним строку exports: exports Sum, Mult, ShowFormDll; //список имен экспортируемых функций

Откомпилируем проект (^F9) и получим новый вариант Bsp.DLL с дополненный формой и процедурой ее создания ShowFormDll.

Создайте новый проект для проверки Bsp.DLL (например, форма с двумя полями ввода чисел и кнопками (суммировать, перемножить, вывести форму) для проверки подпрограмм Sum, Mult, ShowFormDll).

В новом проекте объявите процедуры:

function Mult(x,y:double):double; //объявление функции Mult

external 'bsp.dll' //имя библиотеки DLL с функцией Mult

function Sum(x,y:double):double; //объявление функции Sum

external 'bsp.dll' //имя библиотеки DLL с функцией Sum

procedure ShowFormDll (AOwnenTComponent); //объявление процедуры

external 'bsp.dll' //имя библиотеки DLL с процедурой ShowFormDll.

Вывод формы можно реализовать командой ShowFormDll(Sell).

Контрольные вопросы:

  1. Сколькосуществует способов взаимодействия приложений друг с другом?

  2. Чем отличаются друг от друга функции WinExec и ShellExecute?

  3. Как создать динамически подключаемую библиотеку?

  4. Перечислите функции API Windows для управления окнами.

Рекомендуемая литература: 1.1, 1.7, 1.10.

Лекция№26 Тема: Сообщения Windows и их обработка

План:

1. Сообщения Windows

2. Посылка сообщений

2.1. Функция SendMessage

2.2. Функция PostMessage

3. Обработка сообщений

4. Определение собственных сообщений

1. Сообщения Windows

Приложения Windows состоят из множества объектов, которые взаимодействуют друг с другом, обмениваясь сообщениями (messages).

Сообщение Windows представляет собой структуру, содержащую поля. Наиболее важное из них содержит целое значение, идентифицирующее данное сообщение.

Последовательность обработки сообщений Windows следующая. При создании объекта оконного компонента — потомка TWinControl, он регистрируется в Windows и получает уникальный идентификатор — дескриптор (handle). Вы можете получить к нему доступ через свойство Handle (только для чтения). При регистрации окно передает Windows указатель на процедуру, которая будет вызываться при получении им сообщений от Windows. Это метод MainWndProc. Его назначение — вызов метода обработки сообщений через свойство WindowProc. В итоге все сообщения передаются методу Dispatch, который просматривает таблицу методов класса объекта и извлекает из нее тот, который имеет требуемый идентификатор сообщения. Если требуемый метод не найден — вызывается обработка сообщения по умолчанию.

Таким образом, обработка сообщения Windows происходит по цепочке:

событие => Main WndProc => WndProc => Dispatch => обработчик события

Для сообщений, обрабатываемых компонентами Delphi, вам достаточно написать свой обработчик события. Для сообщений, не предусмотренных в Delphi, вам надо вмешаться в эту цепочку раньше, перегрузив метод WndProc.