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

Лабораторная работа №8 Динамические библиотеки Содержание

Лабораторная работа №8 1

Динамические библиотеки 1

Содержание 1

Задание 1

Проект DLL 1

Экспорт из DLL 2

Соглашения о вызовах 3

Инициализация и завершение работы DLL 4

Вызов DLL 4

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

Явный вызов 6

Ресурсы в DLL 7

Использование модуля ShareMem 7

Вызов dll-библиотеки из Visual C++ 7

Задание

Разработать две динамические библиотеки и приложение их использующие. Каждая из библиотек должна содержать по две функции копирования файлов из лабораторной работы №6. Параметры функций: имя файла приемника, имя файла источника. Для вызова функций первой библиотеки использовать явный вызов, для вызова функций второй библиотеки использовать неявный вызов.

Библиотеки должны быть разработаны на Delphi, приложение, вызывающее их, на VisualC++. (Обратить внимание на формат хранения параметров в стеке.)

Проект dll

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

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

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

Блок begin..endназывается блоком инициализации библиотеки и предназначен для размещения кода, который автоматически выполняется при загрузке DLL.

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

Примечание

При создании динамических библиотек очень удобно использовать группы проектов. В группу помещается проект приложения и проект (проекты) необходимой для его работы динамической библиотеки (библиотек). Для переключения между проектами удобно использовать Диспетчер проектов (команда Project Manager из меню View). Его можно поместить в окно Редактора кода.

Еще один способ удобной работы с проектами динамических библиотек заключается в задании для DLL вызывающей программы. Это делается в диалоге команды Parameters из меню Run. Вызывающее приложение задается в группе Host Application. В результате после компиляции динамической библиотеки вызывается использующее ее приложение.

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

Экспорт из dll

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

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

library DataChek;

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.

При компиляции библиотеки адрес, имя и порядковый номер экспортируемой функции добавляется к специальной таблице экспорта в файле DLL.

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

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

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

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

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