Dynamic
Load Library (DLL). Как их создавать?
Введение
В этой
статье я расскажу Вам как создавать библиотеки, как помещать в
DLL формы, картинки и т.д.
Создание
библиотеки
Для
того чтобы создать библиотеку в Delphi необходимо выбрать File|New
и в появившемся окне New Items
на вкладке New выберите значок
DLL и нажмите OK. Delphi создаст каркас проекта
библиотеки.
Экспорт
функций и процедур
Функции
и процедуры описываются в теле модуля библиотеки (Library).
Для экспорта функций и процедур используется зарезервированное
слово exports, после которого указываются процедуры и функции,
которые должны быть доступны другим вызывающим приложениям. Указываться
должны ТОЛЬКО имена процедур и функций, без параметров,
например:
library
Project1;
uses
SysUtils,
Classes;
{$R
*.RES}
function
Plus(i,y:integer):integer;
begin
Result := i + y;
end;
exports
Plus;
begin
end.
Размещение форм в DLL
Cледует
создать новую форму. Это можно сделать по-разному. Например, выбрав
пункт меню File|New Form. Добавьте на форму какие-нибудь
компоненты. Назовем форму DllForm и сохраним получившийся
модуль под именем DllFormUnit.pas . Теперь в проекте библиотеки
напишем функцию, которая выводит эту форму на экран:
uses
DllFormUnit, Forms, …;
…
function ShowForm : Integer; stdcall;
var
Form : TDLLForm;
begin
Form := TDLLForm.Create(Application);
Result := Form.ShowModal;
Form.Free;
end;
Для
того, чтобы проект компилировался бе ошибок необходимо в секцию
Uses добавить модули Forms и DllFormUnit.
Запишем функцию как экспортируемую функцию:
exports
ShowForm;
Теперь
приложение, вызвав функцию ShowForm нашей библиотеки, выведет
на экран форму DllForm.
Следует
обратить особое внимание на работу с дочерними формами в DLL.
Если, к примеру, в вызывающем приложении главная форма имеет значение
свойства FormStyle, равным MDIForm, то при попытке
вызова из DLL MDIChild-формы, на экране появится
сообщение об ошибке, в котором будет говориться, что нет ни одной
активной MDI-формы. Проблема в том, что при проведении
проверки, в течении которой VCL проверяет корректность
свойства FormStyle главной формы приложения, рассматривается
объект Application, принадлежащий не вызывающему приложению,
а собственно динамической библиотеке. Ну, и естественно, поскольку
в DLL нет главной формы, проверка выдает ошибку. Для того
чтобы избежать такой ситуации, надо назначить объекту Application
динамической библиотеки объект Application вызывающего
приложения. Естественно, это заработает только в том случае, когда
вызывающая программа VCL-приложение. Кроме того, перед
выгрузкой библиотеки из памяти необходимо вернуть значение объекта
Application библиотеки в первоначальное состояние. Это
позволит менеджеру памяти очистить оперативную память, занимаемую
библиотекой. Следовательно, вам нужно сохранить указатель на "родной"
для библиотеки объект Application в глобальной переменной,
которая может быть использована при восстановлении его значения.
Программно эта теория выглядит следующим образом:
…
var
DllApp: Application;
procedure
ShowMDIChild(MainApp : TApplication);
var
Child : TMDIChildForm;
begin
if not Assigned(DllApp) then begin
DllApp := Application;
Application := MainApp;
end;
Child := TMDIChildForm.Create(Application.MainForm);
Child.Show;
end;
procedure
MyDLLProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
{ DLL выгружается.
Восстанавливаем значение указателя Application}
if Assigned(DllApp) then
Application := DllApp;
end;
…
exports
ShowMDIChild, MyDLLProc;
begin
end.
Как
видите использовать формы в библиотеках довольно таки легко. Все
выше описанные примеры можете скачать тут.
Dll и картинки. Загрузка в библиотеку.
Бывает
возникает необходимость также чтобы в библиотеке кроме кода содержалось
еще n-ое количество картинок или иконок (кому что нравиться).
Для загрузки картинки или иконки в библиотеку необходимо включить
их в res файл проекта. Вам следует редактировать res
файл проекта библиотеки. Если имя библиотеки MYDLL.DPR
, то имя файла ресурсов будет соответственно MYDLL.RES
. Это делается при помощи стандартной утилиты Delphi -
Image Editor, которую можно запустить выбрав Tools|Image
Editor. Интерфейс утилиты напоминает Paint, так что
Вы быстро в нем освоитесь.
Выбрав в утилите пункт File|Open найдите нужный Вам файл
и откройте его. После этого вам остается только добавлять нужные
картинки, иконки или курсоры в открытый res файл путем
выбора соответствующего пункта подменю в Resourse|New .
Результат моей работы над res
файлом. Теперь он содержит две иконки, фотографию и курсор.
Очень
важно чтобы ни одно название картинки, иконки или курсора в res
файле не повторялось, а также желательно писать все прописными
буквами.
Далее
просто откомпилируйте проект библиотеки и она готова к употреблению.
Заключение
В двух
статьях было рассмотрено полностью использование динамически загружаемых
библиотек.
|