Динамическое связывание
Динамическое связывание отличается тем, что клиент загружает библиотеку не сразу же после своего размещения в памяти, т.е. после запуска, а по мере надобности. В разделе implementation модуля записано следующее:
type //Процедурный тип функции подгружаемой из библиотеки
TDrawBMP = procedure (Handle : THandle); stdcall;
// Обработка события OnClick на кнопке Button1 с надписью BMP
procedure TForm1.Button1Click(Sender: TObject);
var
hcDll : THandle; //Указатель на библиотеку
DrawBMP : TDrawBMP; //Подгружаемая функция
begin
hcDll := LoadLibrary('Project1.dll'); //Динамическая загрузка DLL
if hcDll <= HINSTANCE_ERROR then begin //Загрузка не удалась
MessageDlg ('Отсутствует библиотека Project1.dll!', mtError, [mbOK], 0);
Exit;
end;
//Библиотека загружена. Получаем адрес точки входа нужной функции
DrawBMP := GetProcAddress(hCDll, 'DrawBMP');
//Проверка на успешность связывания
if not Assigned (DrawBMP) then
begin
MessageDlg ('В библиотеке Project1.dll отсутствует нужная
функция!', mtError, [mbOK], 0);
Exit;
end;
DrawBMP (Canvas1.Handle); //Вызываем функцию
FreeLibrary(hcDll); //Выгружаем библиотеку
end;
Схема такая: загружаем библиотеку только в момент, когда она действительно необходима, получаем адрес требуемой функции и обращаемся к ней. Успешная загрузка библиотеки не является окончательным признаком того, что можно успешно использовать необходимую функцию. В вызываемой библиотеке она может просто отсутствовать.
Задания на разработку:
Создайте и откомпилируйте библиотеку динамической компоновки, содержащую растр, пользуясь описанием в теоретической части.
Для написанной библиотеки создайте клиента, пользуясь статическим связыванием.
Выполните п.2, используя уже динамическое связывание клиента и сервера.
Контрольные вопросы
Что называется сервером и клиентом?
Как создать библиотеку в среде Delphi?
Как создать файл ресурсов и использовать его данные в приложении?
Что называется статическим связыванием клиента и сервера?
Как создать динамическое связывание клиента и сервера?
В чем преимущества использования библиотек?