12164

ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ

Лабораторная работа

Информатика, кибернетика и программирование

ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ Динамические библиотеки DLL Dynamic Link Library играют важную роль в функционировании ОС Windows и прикладных программ. Они представляют собой файлы с откомпилированным исполняемым кодом который используется приложениями и другими DLL. Реализация многи

Русский

2013-04-24

58.5 KB

5 чел.

ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ

Динамические библиотеки (DLL, Dynamic Link Library) играют важную роль в функционировании ОС Windows и прикладных программ. Они представляют собой файлы с откомпилированным исполняемым кодом, который используется приложениями и другими DLL. Реализация многих функций ОС вынесена в динамические библиотеки, которые используются по мере необходимости, обеспечивая тем самым экономию адресного пространства. DLL загружается в память только тогда, когда к ней обращается какой-либо процесс.

По существу динамические библиотеки отличаются от исполняемых файлов только одним, они не могут быть запущены самостоятельно. Для того чтобы динамическая библиотека начала работать, необходимо, чтобы ее вызвала уже запущенная программа или работающая DLL.

Обычно в динамические библиотеки выносятся группы функций, которые применяются для решения сходных задач. Кроме этого, в них можно хранить и использовать разнообразные ресурсы — от строк локализации до форм.

Динамическая библиотека может использоваться несколькими приложениями, при этом не обязательно, чтобы все они были созданы при помощи одного языка программирования.

Создание DLL

Для создания динамической библиотеки в Delphi имеется специальный шаблон. Его значок DLL Wizard расположен на странице File -> New -> Other страница New. В отличие от проекта обычного приложения, проект DLL состоит всего из одного исходного файла. Впоследствии к нему можно добавлять отдельные модули и формы.

library Projectl;

uses

SysUtils, Classes;

{$R *.res}

begin 

end.

Для определения типа проекта используется ключевое слово library (вместо program в обычном проекте). При компиляции такого проекта динамической библиотеки создается файл с расширением dll.

Как и в любом другом проекте, в проекте динамической библиотеки можно использовать иные модули. Это могут быть просто модули с исходным кодом и модули форм. При этом динамическая библиотека может экспортировать функции, описанные не только в главном файле, но и в присоединенных модулях.

Для создания перечня экспортируемых из динамической библиотеки процедур и функций используется ключевое слово exports(exports имена экспортируемых функций через запятую). При этом можно указывать как функции, описанные в главном файле DLL, так и функции из присоединенных модулей.

В качестве примера рассмотрим исходный код динамической библиотеки DataCheck, простейшие функции которой проверяют введенную строку перед конвертацией на соответствие одному из типов данных.

library DataCheck; 

uses

 Windows, SysUtils, Classes, Messages, Forms, Dialogs, StdCtrls, ComCtrls;

function ValidDate(AText: String): Integer; 

begin

 try

   Result := 0; StrToDate(AText); 

 except

   on E:EConvertError do Result := -1; 

 end; 

end;

function ValidTime(AText: String): Integer;

begin 

 try

   Result := 0; StrToTime(AText);

  except

   on E:EConvertError do Result := -1; 

 end; 

end;

function Validlnt(AText: String): Integer;

begin 

 try

   Result := 0; StrToInt(AText);

  except

   on E:EConvertError do Result := -1;

   end;

end;

exports Validlnt, ValidDate index 1, ValidTime index 2 name 'IsValidTime';

begin

 if Length(DateToStr(Date)) < 10 then

   ShowMessage('Год представлен двумя цифрами');

end.

Три функции этой библиотеки обеспечивают проверку строки перед преобразованием ее в целое число, дату или время. Для обеспечения экспорта этих функций их необходимо объявить в секции exports.

Имена процедур и функций в секции экспорта разделяются запятыми. Внимательный взгляд на пример экспорта в листинге 28.2 обнаруживает три различных варианта объявления.

В первом варианте компилятор самостоятельно определяет положение функции в таблице экспорта.

При использовании ключевого слова index следующее за ним число задает положение функции в таблице экспорта относительно других таких же функций.

Ключевое слово name позволяет экспортировать функцию под другим именем.

При загрузке динамической библиотеки выполняется код инициализации, который расположен в блоке begin..end. Обычно здесь выполняются операции по заданию начальных значений используемых в функциях библиотеки переменных, проверка условий функционирования DLL, создание необходимых структур и объектов и т. д.

Теперь рассмотрим, как из динамических библиотек вызываются функции. Функции динамических библиотек могут вызываться двумя способами — явным и неявным.

Неявный вызов

Механизм неявного вызова наиболее прост, так как выполняется автоматически и основан на имеющейся в приложении информации о вызываемых функциях и динамических библиотеках. Однако разработчик не имеет возможности влиять на ход загрузки DLL. Если операционная система не смогла загрузить библиотеку, просто выдается сообщение об ошибке.

В качестве примера неявного вызова рассмотрим простое приложение DemoDLL, использующее функции библиотеки DataCheck (см. выше). Для этого в нем имеются три компонента TEdit, в которых осуществляется проверка введенной строки на соответствие формату одного из типов данных.

unit DemoUnit;

        interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, comctrls, Buttons;

type

 TMainForm = class(TForm)

   IntEdit: TEdit;

   DateEdit: TEdit;

   TimeEdit: TEdit;

   IntLabel: TLabel;

   DateLabel: TLabel;

   TimeLabel: TLabel;

   procedure IntEditExit(Sender: TObject);

   procedure DateEditExit(Sender: TObject);

   procedure TimeEditExit(Sender: TObject);

 end;

var

 MainForm: TMainForm;

 function Validlnt(AText: String): Boolean; external 'DataCheck.dll'; 

 function ValidDate(AText: String): Boolean; external 'DataCheck.dll';

  function IsValidTime(AText: String): Boolean; external 'DataCheck.dll';

implementation

{$R *.DFM}

procedure TMainForm.EditlExit(Sender: TObject);

 begin

  if not IsValidlnt(IntEdit.Text) then

    IntEdit.Clear;

 end;

procedure TMainForm.Edit2Exit(Sender: TObject);

begin

 if not IsValidDate(DateEdit.Text) then

  DateEdit.Clear;

        end;

procedure TMainForm.Edit3Exit(Sender: TObject); 

begin

 if not ValidTime(TimeEdit.Text) then

   TimeEdit.Clear;

end;

end.

Для организации неявного вызова достаточно объявить нужную функцию с директивой external и указать имя содержащей ее динамической библиотеки. Обратите внимание, что третья функция объявлена под псевдонимом isValidTime, который объявлен для этой функции при помощи ключевого слова name в исходном коде динамической библиотеки.

В дальнейшем импортированные функции используются обычным образом.

Явный вызов

Явный вызов динамической библиотеки подразумевает создание программистом соответствующего исходного кода. Ему необходимо предусмотреть загрузку DLL, получение адресов переменных процедурного типа для используемых функций и процедур, выгрузку DLL.

Пример явного вызова функций динамической библиотеки имеется в демонстрационном приложении DemoDLL, которое по выполняемым функциям полностью совпадает с предыдущим примером.

Листинг 28.6. Модуль главной формы проекта DemoDll2

unit DemoUnit;

interface

uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

 StandardProc = function(AText: String): Boolean;

 

 TMainForm = class(TForm)

   IntEdit: TEdit;

   DateEdit: TEdit;

   TimeEdit: TEdit;

   IntLabel: TLabel;

   DateLabel: TLabel;

   TimeLabel: TLabel;

   procedure FormShow(Sender: TObject);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure IntEditExit(Sender: TObject);

   procedure DateEditExit(Sender: TObject);

   procedure TimeEditExit(Sender: TObject);

 

private

 DLLHandle: THandle;

 LoadError: Word;

 IsValidlnt: StandardProc;

 IsValidDate: StandardProc;

 ValidTime: StandardProc;  

        end;

var

 MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.FormShow(Sender: TObject);

begin

 DLLHandle := LoadLibrary('DataCheck');

  if DLLHandle = 0 then

 begin

   if GetLastError = ERROR_DLL_NOT_FOUND then

     ShowMessage('Ошибка загрузки DLL'); 

   Close;

  end;

 IsValidInt := GetProcAddress(DLLHandle, 'IsValidlnt');

  SIsValidDate := GetProcAddress(DLLHandle, 'IsValidDate');

 SValidTime := GetProcAddress(DLLHandle, 'ValidTime');

  end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 if DLLHandle <> 0 then

   FreeLibrary(DLLHandle);

end;

procedure TMainForm.IntEditExit(Sender: TObject); 

begin

 if not IsValidlnt(IntEdit.Text) then

   IntEdit.Clear; 

end;

procedure TMainForm.DateEditExit(Sender: TObject);

begin

  if not IsValidDate(DateEdit.Text) then

    DateEdit.Clear; 

end;

procedure TMainForm.TimeEditExit(Sender: TObject);

 begin 

  if not ValidTime(EditTime.Text) then

    TimeEdit.Clear;

 end;

         end.

Загрузка динамической библиотеки DataCheck осуществляется в методе-обработчике FormShow при помощи функции LoadLibrary. Имя динамической библиотеки может не содержать маршрута, если файл DLL расположен в одном каталоге с программой. Если в этом каталоге файл DLL не найден, поиск последовательно проводится в текущем каталоге, \SYSTEM и каталогах из перечня Path.

Если библиотека успешно загружена, в три процедурные переменные типа standardProc передаются адреса соответствующих функций DLL. Процедурный тип standardProc объявлен перед классом формы. Для этого используется системная функция GetProcAddress.

При закрытии приложения необходимо выгрузить все используемые динамические библиотеки При помощи системной функции FreeLibrary.


 

А также другие работы, которые могут Вас заинтересовать

24011. Обеспечение безопасности при проведении туристских походов 18.68 KB
  При необходимости члены МКК дают советы руководителям по планированию маршрута действиям на какихлибо сложных его участках однако техническая и тактическая подготовка участников похода остается вне зоны внимания МКК. Зачастую участники выполняют задания без участия руководителя группы. Здесь причины возникновения аварийных экстремал ных ситуаций можно разделить на три группы: возникающие по вине руководителя группы; возникающие по вине детей участников похода; природные факторы и несчастные случаи в походе. В походах с детьми как нигде...
24012. Опасности в различных видах туризма 18.29 KB
  Признаки лавиноопасности: обильный снегопад перепады температур наличие лавинных концов в нижней части различные валы камни вырванные деревьяМеры предосторожности: переход осуществлять в нижней части; страховка; если участок протяжённый нужно переходить по одному с помощью лавинного шнура обязательно нужен смотритель; желательно проходить утром либо ночью. Меры предосторожности: спланировать переход должна быть тактика перехода выбор места переправы время и способ переправы переправу нужно планировать на утреннее часы. Меры...
24013. ПРАВОВЫЕ И ЭТИЧЕСКИЕ НОРМЫ ЖУРНАЛИСТСКОЙ ДЕЯТЕЛЬНОСТИ 44.83 KB
  19 ВДПЧ: свобода убеждений и выражения их сбора и распространения информации и идей любыми средствами независимо от государственных границ.29 гарантия свободы мысли и слова свобода искать получать передавать и распространять информацию гарантия свободы массовой информации запрет на цензуру. Журналист имеет право: 1 искать запрашивать получать и распространять информацию; 2 посещать государственные органы и организации предприятия и учреждения либо их прессслужбы; 3 быть принятым должностными лицами в связи с запросом...
24014. МЕДИАСОЦИОЛОГИЯ И МЕДИАПСИХОЛОГИЯ 57.93 KB
  Журналист обязан иметь при себе достаточный запас ручек на случай если какаялибо из них подведет в нужный момент и как минимум пару блокнотов: для записи официальных бесед и для фиксации неофициальной информации. Диктофон фиксирует ход беседы при непосредственном контакте с собеседником но не имеет возможности фиксировать мысли журналиста возникающие по ходу беседы поэтому блокнот остается непременным атрибутом журналиста всегда он помогает при переработке поступающей информации. При сборе информации он контактирует с индивидуальным...
24015. ИСТОРИЯ ОТЕЧЕСТВЕННОЙ ЖУРНАЛИСТИКИ 211.12 KB
  16 декабря этот указ был напечатан а уже 17 декабря появился в свет первый номер новой газеты Ведомости и его следует считать первенцем русской периодики. 27 декабря вышел следующий номер газеты имевший особое название Юрнал или поденная роспись что в мимошедшую осаду под крепостью Нотебурхом чинилось сентября с 26 числа в 1702 году. Очередной номер газеты изданный 2 января 1703 г. Эти лаконичные и разнообразные сообщения первого номера русской газеты полны глубокого смысла и подбор их великолепен.
24016. ИСТОРИЯ ЗАРУБЕЖНОЙ ЖУРНАЛИСТИКИ 139.3 KB
  Подзаголовок газеты: Казуистическая газета . Успех газеты был велик количество писем все росло. Острота вопроса в том что все это были газеты и журналы разных направлений. Ричард Стиль бывший в ту пору редактором официальной газеты решил использовать созданную Свифтом маску для издания нового журнала в 1709 г.
24017. ОБЩАЯ ТЕОРИЯ ЖУРНАЛИСТИКИ 73.5 KB
  Новостные блоки в СМИ и начинаются с сенсаций делая безнадежными поиски смысла в эфире. Общественное мнение и СМИ: диалектика взаимодействия.Индивидуальную картину мира человека создают СМИ. Уклон в развлечение во всех СМИ особенно в ТВ.
24018. ЖУРНАЛИСТИКА В СОВРЕМЕННОМ ИНФОРМАЦИОННОМ ПРОСТРАНСТВЕ 69.31 KB
  В информационном же пространстве разворачивается истинная журналистика не ограниченная правилами и цензурой пример СМИ vs СМК. Последствия информационнопсихологического воздействия СМИ глубокие изменения массового сознания. СМИ и информационное общество.общва поставила вопрос о роли в нем СМИ.
24019. ОРГАНИЗАЦИЯ РАБОТЫ СМИ 128.94 KB
  В других статьях определяется статус редакции учредителя и издателя их права обязанности и взаимоотношения. В Уставе наряду с другими сторонами ее статуса определяются взаимные права и обязанности учредителя редакции и возглавляющего ее главного редактора. Учредитель утверждает устав редакции и или заключает с ней или ее главным редактором договор. В Законе указывается что учредитель также может выступать в качестве редакции издателя распространителя собственника имущества редакции.