Dynamic Link Library

Содержание

Слайд 2

При запуске нескольких экземпляров одного приложения, Windows загружает в оперативную память только

При запуске нескольких экземпляров одного приложения, Windows загружает в оперативную память только
одну копию кода и ресурсов - модуль приложения, создавая несколько отдельных сегментов данных, стека и очереди сообщений, каждый набор которых представляет из себя задачу, в понимании Windows.
Копия приложения представляет из себя контекст, в котором выполняется модуль приложения.
DLL - библиотека также является модулем. Она находится в памяти в единственном экземпляре и содержит сегмент кода и ресурсы, а также сегмент данных

Слайд 3

DLL - библиотека, в отличие от приложения не имеет ни стека, ни

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

Слайд 4

Создание DLL в Delphi (экспорт)

library ProjectDLL;
{ информативные строк.}
uses
SysUtils,
Classes;
{$R *.RES}
exports
begin
end.

Создание DLL в Delphi (экспорт) library ProjectDLL; { информативные строк.} uses SysUtils,

Слайд 5

Exports

exports
Func1 index 10 name 'Fun',
Func3 index 11,
Func4 index 11,//Ошибка,

Exports exports Func1 index 10 name 'Fun', Func3 index 11, Func4 index
такой индекс уже существует
Func5 name 'Don';
Объявлять можно и так:
exports Func1 index 10 name 'Fun',
exports Func2 Insert,
exports Func3 index 11
Резидентные
exports
ExportByName name 'MYEXPORTPROC' resident;

Слайд 6

Использование DLL в Delphi (импорт)

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

Использование DLL в Delphi (импорт) В вашей программе следует объявить функции, импортируемые
DLL таким образом:
procedure ImportByName;external 'MYDLL' name 'MYEXPORTPROC';
procedure ImportByOrdinal; external 'MYDLL' index 10;
procedure MyExportFunc1; external 'MYDLL';
Этот способ называется статическим импортом.

Слайд 7

Динамическая загрузка dll

type TMyProc = procedure(Handle: THandle); stdcall; процедурный тип функции подгружаемый

Динамическая загрузка dll type TMyProc = procedure(Handle: THandle); stdcall; процедурный тип функции
из библиотеки;
var
Handle : THandle; - указатель на библиотеку
MyImportProc : TMyProc; - подгружаемая функция
begin
Handle:=LoadLibrary('MYDLL');-динамическая загрузка DLL
@MyImportProc:=GetProcAddress(Handle,'MYEXPORTPROC');
Получение адреса точки входа нужной функции
FreeLibrary(Handle); - Освобождение ресурса
end;

Слайд 8

Пример

Пример

Слайд 9

library ProjectDLL;
uses
SysUtils, Classes;
{$R *.RES}
exports ShowAbout index 10;
begin
end.

library ProjectDLL; uses SysUtils, Classes; {$R *.RES} exports ShowAbout index 10; begin end.

Слайд 10

File->New Form

File->New Form

Слайд 11

текст модуля

var
Form1: TForm1;
procedure ShowAbout(Handle: THandle);export;stdcall;
после implementation и ключа {$R

текст модуля var Form1: TForm1; procedure ShowAbout(Handle: THandle);export;stdcall; после implementation и ключа
*.DFM}:
procedure ShowAbout(Handle: THandle);
begin
//Установить указатель на приложение
Application.Handle := Handle;
//Создать форму
Form1:= TForm1.Create(Application);
//Отобразить
Form1.ShowModal;
//Очистить
Form1.Free;
end;

Слайд 12

В новом проекте

unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms,

В новом проекте unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics,
Dialogs, StdCtrls;
procedure ShowAbout(Handle: THandle)stdcall;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure ShowAbout;external 'ProjectDLL.dll' index 10;
implementation

Слайд 13

Вызов функции из DLL

Теперь поместим на форму кнопку и создадим для неё

Вызов функции из DLL Теперь поместим на форму кнопку и создадим для
следующее событие:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowAbout(Handle);
end;

Слайд 14

library MyFirstDLL;
uses SysUtils, Classes, Forms, Windows; procedure HelloWorld(AForm : TForm); begin

library MyFirstDLL; uses SysUtils, Classes, Forms, Windows; procedure HelloWorld(AForm : TForm); begin

MessageBox(AForm.Handle, Hello world!', DLL Message Box', MB_OK or MB_ICONEXCLAMATION);
end;
exports HelloWorld;
begin
end.

Слайд 15

Создание проекта библиотеки DLL в Visual Studio 2019

Файл > Создать > Проект, чтобы открыть диалоговое окно Создание проекта.

Создание проекта библиотеки DLL в Visual Studio 2019 Файл > Создать >

Слайд 16

В верхней части диалогового окна для параметра Язык установите значение Язык С,
для параметра Платформа — значение Windows,

В верхней части диалогового окна для параметра Язык установите значение Язык С,
для параметра Тип проекта — значение Библиотека.
В отфильтрованном списке типов проектов щелкните Библиотека динамической компоновки (DLL) , а затем нажмите кнопку Далее.

Слайд 17

На странице Настроить новый проект введите MathLibrary в поле Имя проекта. 
Примите заданные по умолчанию Расположение и Имя решения. 
Для параметра Решение задайте Создать новое

На странице Настроить новый проект введите MathLibrary в поле Имя проекта. Примите
решение. Снимите флажок Разместить решение и проект в одном каталоге, если он установлен.
Нажмите кнопку Создать, чтобы создать проект.

Слайд 18

 Затем вы создадите файл заголовка для объявления функций, экспортируемых вашей библиотекой DLL,

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

Слайд 19

Чтобы создать файл заголовка для функций, последовательно щелкните Проект > Добавить новый элемент.
В диалоговом окне Добавление

Чтобы создать файл заголовка для функций, последовательно щелкните Проект > Добавить новый
нового элемента в левой области щелкните Visual C++ . В центральной области выберите Заголовочный файл (.h) . Укажите MathLibrary.h в качестве имени для файла заголовка.

Слайд 21

Нажмите кнопку Добавить, чтобы создать пустой файл заголовка, который отображается в новом

Нажмите кнопку Добавить, чтобы создать пустой файл заголовка, который отображается в новом окне редактора.
окне редактора.

Слайд 22

// MathLibrary.h
- Contains declarations of math functions #pragma once
#ifdef MATHLIBRARY_EXPORTS

// MathLibrary.h - Contains declarations of math functions #pragma once #ifdef MATHLIBRARY_EXPORTS

#define MATHLIBRARY_API __declspec(dllexport)
#else #define MATHLIBRARY_API __declspec(dllimport)
#endif

Слайд 23

В обозревателе решений щелкните узел Файлы решения правой кнопкой мыши и выберите пункты 
Добавить  >  Новый элемент. Создайте

В обозревателе решений щелкните узел Файлы решения правой кнопкой мыши и выберите
новый CPP-файл с именем MathLibrary.cpp, аналогично добавлению нового файла заголовка на предыдущем шаге.