DNSoft - разработка программного обеспечения

2003 (С) ВСЕ ПРАВА ЗАЩИЩЕНЫ

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
e
nd.

Как видите использовать формы в библиотеках довольно таки легко. Все выше описанные примеры можете скачать тут.


Dll и картинки. Загрузка в библиотеку.

Бывает возникает необходимость также чтобы в библиотеке кроме кода содержалось еще n-ое количество картинок или иконок (кому что нравиться). Для загрузки картинки или иконки в библиотеку необходимо включить их в res файл проекта. Вам следует редактировать res файл проекта библиотеки. Если имя библиотеки MYDLL.DPR , то имя файла ресурсов будет соответственно MYDLL.RES . Это делается при помощи стандартной утилиты Delphi - Image Editor, которую можно запустить выбрав Tools|Image Editor. Интерфейс утилиты напоминает Paint, так что Вы быстро в нем освоитесь.
Выбрав в утилите пункт File|Open найдите нужный Вам файл и откройте его. После этого вам остается только добавлять нужные картинки, иконки или курсоры в открытый res файл путем выбора соответствующего пункта подменю в Resourse|New .


Результат моей работы над res файлом. Теперь он содержит две иконки, фотографию и курсор.

Очень важно чтобы ни одно название картинки, иконки или курсора в res файле не повторялось, а также желательно писать все прописными буквами.

Далее просто откомпилируйте проект библиотеки и она готова к употреблению.


Заключение

В двух статьях было рассмотрено полностью использование динамически загружаемых библиотек.

2003 (C) Все права защищены Корнушковым Николаем
Hosted by uCoz