Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_8_dll.doc
Скачиваний:
18
Добавлен:
29.03.2015
Размер:
95.23 Кб
Скачать

Вызов dll

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

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

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

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

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

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

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

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

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

unit Unit1;

interface

uses

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

type

TMainForm = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

procedure Edit1Exit(Sender: TObject);

procedure Edit2Exit(Sender: TObject);

procedure Edit3Exit(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

var

MainForm: TMainForm;

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

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

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

implementation {$R *.DFM}

procedure TMainForm.Edit1Exit(Sender: TObject);

begin

if not IsValidInt(Edit1.Text) then Edit1.Clear;

end;

procedure TMainForm.Edit2Exit(Sender: TObject);

begin

if not IsValidDate(Edit2.Text) then Edit2.Clear;

end;

procedure TMainForm.Edit3Exit(Sender: TObject);

begin

if not ValidTime(Edit3.Text) then Edit3.Clear;

end;

end.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]