| NIKIOP | Дата: Пятница, 30.03.2012, 12:08 | Сообщение # 1 |
 Знаток
Группа: Свой человек
Сообщений: 63
| Понимая как начинающему не просто самому понять как создавать динамические библиотеки (Dynamic Link Library),я решил написать эту статью, в которой постараюсь раскрыть основные принципы работы с Dll в Delphi.
Для начала нужно знать почему в некоторых случаях лучше сделать Dll,а не просто Модуль. Возможно в нескольких ваших приложениях окажется одинаковый блок кода, не совсем малых размеров, вы можете сделать Модуль и подключить к каждому проекту, но размер EXE файла будет больше, нежели когда вы создадите одну Dll, и будете её использовать во многих программах. Когда вы работаете с динамической библиотекой, вы значительно экономите память, так как в нее загружается всего один экземпляр Dll для всех программ. Что же могут Динамические библиотеки: -Хранить в них звуки,картинки,иконки,курсоры и многое другое -Использоваться в качестве плагинов (для того чтобы не редактировать сам файл программы) -Помещать туда диалоговые,простые окна;меню и всевозможные другие ресурсы -Давать возможность другим программистам использовать вашу библиотеку на других языках
Перейдем от теории к практики.
Напишем Dll, которая будет содержать в себе две математические функции: 1)Вычисление Факториала числа. 2)Нахождение суммы двух чисел.
Для начала нужно создать Dll в дельфи, для этого делаем следующее: File->New->Other->Dll Wizard Появится проект вашей новой Dll.
Теперь напишем наши две функции:
Код Delphi function Fucktorial(N:integer):integer;stdcall; var p:integer; begin for p:=1 to N do N:=N*P; Result :=N; end; function Symma(a,b:integer):Integer;stdcall; begin Result :=a+b; end; После каждой функции вы можете заметить что стоит stdcall,эта деректива предписывает использование стандартных соглашений о вызове функций, конечно это не обязательно.
Далее мы должны сделать чтобы эти функции были доступны извне.Для этого существует ключевое слово Exports Вот так выглядит в нашей программе экспортирование
Код Delphi exports Fucktorial,Symma; Теперь когда Dll готова, сохраним её под именем Math(Имя конечно может быть любое) File->Save Project As
Неявная(статическая) загрузка Осталось создать приложение, которое будет использовать функции нашей Dll File->New->Application
Для примера я поместил на форму: два TEdit, два TButton, один TLabel
После ключегого слова implementation объявим наши функции таким образом
Код Delphi function Symma(a,b:integer):Integer;stdcall;external 'Math.dll'; function Fucktorial(N:integer):integer;stdcall;external 'Math.dll'; Как можно заметить здесь присутствует незнакомое слово external.Так мы определяем где находится наша функция,и откуда её вызывать.В нашем проекте мы вызываем функции из только что созданной Dll.
Напишем код в наши Button
Код Delphi //суммирование двух чисел procedure TForm1.btn1Click(Sender: TObject); var a,b,c:integer; //переменные для чисел begin a:=StrToInt(edt1.text); b:=StrToInt(edt2.text); C:=Symma(a,b); lblResult.Caption := 'Результат:' + IntToStr©; end; //расчет факториала procedure TForm1.btn2Click(Sender: TObject); var N:Integer; begin N:=StrToInt(edt1.text); lblResult.Caption := 'Результат:' + IntToStr(Fucktorial(N)); end; Теперь осталось скомпилировать приложение и можно проверять его работу.
Теперь нужно сказать пару слов о проблемах,которые могут возникнуть.
Ваша Dll должна находиться в следующих местах:рядом с программой,System.Если библиотека не найдена программой в этих местах то вылазиет неприятное сообщение об ошибке.
и ваша программа сразу завершит свою работу, это недостаток неявной(статической) загрузки Dll,далее мы рассмотрим как этого избежать с помощью явной(динамической) загрузкой.
|
| |
| |