|
Можно ли сдавать один и тот же тест несколько раз? |
Библиотека классов VCL среды проектирования Delphi. Приложения и диалоги
Статическое и динамическое подключения DLL-библиотеки
DLL-библиотека может подключаться или статически, или динамически. При подключении DLL-библиотеки она загружается в память приложения.
При статическом подключении DLL-библиотека загружается один раз при запуске приложения.
На всем протяжении выполнения приложения имя функции, импортируемой из DLL-библиотеки, которая была подключена статически, указывает на одну и ту же функцию (точку входа в DLL) в одной и той же DLL.
В отличие от статического подключения DLL-библиотеки, выполняемого в момент загрузки приложения, динамическое подключение может быть выполнено в любой точке выполнения программы. После вызова функции из DLL-библиотеки ее можно отключить. При одновременном использовании нескольких DLL-библиотек это дает ощутимую экономию памяти.
Для динамического подключения DLL-библиотеки применяются функции Windows API. Windows API - это набор стандартных функций, используемый для реализации взаимодействия с операционной системой.
Все функции из статически подключаемой DLL-библиотеки, которые будут использоваться в приложении, первоначально должны быть объявлены как внешние.
При этом следует указать, если требуется, модификатор вызова. Если функция вызывается по индексу, то для нее следует задать имя, используемое в приложении и индекс функции в DLL-библиотеке.
Объявления внешних функций выполняется в секции implementation до использования этих функций.
Объявление внешней функции с ключевым словом external определяет, что будет применено статическое связывание.
Например:
function F1 (i: Integer): Integer; stdcall;
external 'MyLib.dll';При вызове функции из динамически подключаемой DLL-библиотеки, вместо определения имени функции как external, в случае статического связывания, следует определить новый тип, соответствующий типу вызываемой функции, и создать переменную данного типа.
Определение типа функции или процедуры описывается так:
Новый_тип =function(список_параметров):тип_функции; модификатор_доступа; или Новый_тип=procedure(список_параметров); модификатор доступа;.
Следующий пример иллюстрирует вызов функции из динамически подключаемой DLL-библиотеки:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button3: TButton;
procedure Button3Click(Sender: TObject);
end;
TMyF1=function( i:Integer):Integer; stdcall; {Создание
типа функции}
var
Form1: TForm1;
MyF1 : TMyF1; {Объявление переменной типа функции}
implementation
{$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);
var
h: Integer;
begin
h:=LoadLibrary('MyLib.dll'); // Динамическое подключение
if h <> 0 then
begin
@MyF1:=GetProcAddress(h,'F1'); // Получение адреса функции
if @MyF1 <> nil then
ShowMessage(IntToStr(MyF1(20)); // Вызов Функции
FreeLibrary(h); // Освобождение dll-библиотеки
end;
end;
end.