сматривает имена в таблице имен в поисках нужного. Так как имена могут состоять из длинных наборов символов и самих имен в таблице может быть много, процесс поиска имени существенно медленнее, чем процесс поиска индекса. Поэтому опытные программисты предпочитают ссылаться не на имя, а на индекс подпрограммы. Тем не менее, нельзя исключить возможность того, что программа будет вызывать DLL—подпрограмму по имени^ В этом случае затраты времени на поиск можно заметно сократить, если указать в списке Exports слово resident:

Exports

MyFunc index 1 name 'NEWFUNC' resident;

Информация о подпрограмме, экспортируемой с признаком resident, сохраняется в памяти во все время использования библиотеки.

Замечу, что в отличие от модулей ВР не компилирует DLL автоматически в режимах MAKE или BUILD, т.к. справедливо рассматривает ее как другую программу, никак не связанную в момент компиляции с основной программой.

В заключение рассмотрим реальный пример создания DLL, в котором иллюстрируются различные приемы объявления экспортируемых подпрограмм. Для примера я выбрал модуль Cmplx, описанный в п.9.7. В его состав входят 4 процедуры, реализующие действия с комплексными числами. Вариант соответствующей DLL показан ниже.

{$N+,E+} {Используем сопроцессор для типа Single} Library Complex;

type

TComplex = record Re, Im: Single

end;

Procedure CmplxAdd(x, y: TComplex; var z: TComplex); Export;

begin

z.Irn := x.Im + y.Im;

z . Re : = x. Re + у. Re end;

Procedure CmplxSub(x, y: TComplex; var z: TComplex); Export;

begin

z.Im := x.Im - y.Im;

z. Re : = x. Re - у. Re end;

Procedure CmplxMul(x, y: TComplex; var z: TComplex); Export;

begin

z.Re := x.Re * y.Re + x.Im * y.Im;

z.Im := x.Re * y.Im - x.Im * y.Re end;