ТОР 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 и их динамического подключения, изучение особенностей использования форм в библиотеках. Не нашли, что искали? Воспользуйтесь поиском:
|