Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Пример 20. 2. Создать библиотеку содержащую функции сложения целых и вещественных чисел, а также строк. Код библиотеки имеет вид




library MyDll;

//Только Ппри передаче строк не забудьте включить в этот раздел

// модуль ShareMem

uses

ShareMem,

SysUtils,

Classes;

{$R *.res}

//Глобальная для DLL переменная

var GlbVar:real; //приведена в качестве примера и не используется [BP5]

//Библиотека включает три экспортируемые функции и

// одну внутреннюю функцию

//Сложение целых чисел

function AddInt(a,b:integer):integer;

begin

Result:=a+b;

end;

//Сложение действительных чисел

function AddReals(c,d:real):real;

begin

Result:=c+d;

end;

//Сложение строк чисел

function AddStr(e,f:string):string;

Begin

Result:=e+f;

end;

//внутренняя (неэкспортируемая) функция

//приведена в качестве примера и не используется

function intfunc():integer;

Begin

Result:=1;

end;

//экспортирование функций

Exports

AddInt,

AddReals,

//для функции сложения строк задается внешнее имя

AddStr name 'AddStrfromDll';

Begin

End.

Статический вызов библиотеки

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

При вызове библиотеки программист не имеет возможности указывать ее раз­мещение, поэтому библиотека должна быть расположена в каталоге, в котором она будет найдена Windows автоматически. Такими каталогами являются, на­пример, корневой каталог Windows, его подкаталоги SYSTEM и SYSTEM32, а также каталог, из которого запущено приложение. Если при выполнении при­ложения необходимая библиотека не найдена, то выдается соответствующее со­общение (рис. 20.4).

 

Рис. 20.4. Сообщение об ошибке, если библиотека не найдена

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

Для статического доступа к библиотечной функции необходимо объявить ее как внешнюю (импортируемую). Это объявление располагается в разделе реализа­ции модуля и имеет следующий вид:

Заголовок функции> external <Имя библиотеки>;

Заголовок функции должен совпадать с заголовком функции из библиотеки, однако в качестве имени функции указывается ее внешнее имя из раздела exports. Имя библиотеки представляет собой строку с именем файла, также со­держащим расширение DLL.

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

 

Пример 20.3. Используем статически функции, описанные в библиотеке (см. пример 20.2). Экранная форма программы показана на рис. 20.5. Фрагмент кода с использованием функций из библиотеки:

implementation

{$R *.dfm}

//объявление функций как внешних (импортируемых).

// В качестве имен функций указываются их внешние имена

// из раздела exports библиотеки.

// Для имени файла библиотеки не забудьте указать расширение dll

function AddInt(a,b:integer):integer; external 'MyDll.dll';

function AddReals(c,d:real):real; external 'MyDll.dll';

function AddStrfromDll(e,f:string):string; external 'MyDll.dll';

procedure TUntUseDllMain.BtnAddIntClick(Sender: TObject);

var N1,N2,Res:integer;

Begin

N1:=strtoint(EdtInt1.Text);

N2:=strtoint(EdtInt2.Text);

Res:=AddInt(N1,N2);

EdtResInt.Text:=inttostr(Res);

end;

procedure TUntUseDllMain.BtnAddRealClick(Sender: TObject);

var N1,N2,Res:real;

Begin

N1:=strtoFloat(EdtReal1.Text);

N2:=strtoFloat(EdtReal2.Text);

Res:=AddReals(N1,N2);

EdtResReal.Text:=Floattostr(Res);

end;

procedure TUntUseDllMain.BtnAddStrClick(Sender: TObject);

var N1,N2,Res:string;

Begin

N1:=EdtStr1.Text;

N2:=EdtStr2.Text;

Res:=AddStrfromDll(N1,N2);

EdtResStr.Text:=Res;

end;

End.

Рис. 20.5. Экранная форма примера 20.3


Рис. 20.6. Экранная форма для лабораторной работы № 20

Порядок выполнения работы

1. На основе варианта задания из лабораторной работы 15 создать библиотеку динамической компоновки, в которую поместить табулируемую функцию и функции, связанные с проверками области допустимых значений. Статический вызов библиотеки разместить в основном модуле. Построить график функции. Для этого добавить в пункт меню «Вычисления» и контекстное меню пункт «Построение графика». Диаграмму разместить в отдельном окне.

2. Обработать все возможные исключительные ситуации.

Приблизительный вид форм показан на рис. 20.6.

Контрольные вопросы

1. Создание библиотеки динамической компоновки.

2. Экспортирование функций.

3. Статическое подключение библиотеки.

4. Компонент TCchart (диаграмма). Особенности его использования для построения графиков.

5. Основные свойства и методы диаграммы.

Лабораторная работа № 21
Использование форм в библиотеках динамической компоновки (Dll). динамическое подключение Dll.

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






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных