Аналогично статическим модулям оверлейные модули могут со-
держать секцию инициализации. Хотя оверлейный код инициализации
не отличается от обычного кода инициализации, администратор овер-
леев должен первоначально инициализироваться таким образом, чтобы
он мог загружать и выполнять оверлейные модули.
Взяв в качестве примера ранее рассмотренную программу
Editor, предположим, что модули EdInOut и EdMain содержат код
инициализации. При этом требуется, чтобы процедура OvrInit вызы-
валась перед кодом инициализации модуля EdInOut, и единственный
способ осуществить это состоит во введении дополнительного нео-
верлейного модуля, который следует перед EdInOut и вызывает в
своем разделе инициализации процедуру OvrInit.
unit EdInit;
interface
implementation
uses Overlay;
const
OvrMaxSize = 80000;
begin
OvrInit('EDITOR.OVR');
OvrInitEMS;
OvrSetBuf(OvrMaxSize);
end.
В операторе uses программы модуль EdInit должен следовать
перед всеми оверлейными модулями:
program Editor;
{$F}
uses
Overlay,Crt,Dos,EdInit,EdInOut,EdFormat,EdPrint,EdMain;
{$O EdInOut }
{$O EdFormat }
{$O EdPrint }
{$O EdFind }
{$O EdMain }
В общем случае, хотя использование кода инициализации в
оверлейных модулях и допускается, по ряду причин его следует из-
бегать.
Во-первых, код инициализации, даже если он выполняется толь-
ко один раз, является частью оверлея и будет занимать пространс-
тво в оверлейном буфере при каждой загрузке оверлея. Во-вторых,
если большое число оверлейных модулей содержат код инициализации,
каждый из них придется считывать в память при загрузке программы.
Намного более привлекательный подход состоит в том, чтобы
собрать весь код инициализации в оверлейный модуль инициализации,
который вызывается только один раз при загрузке программы и к ко-
торому затем программа не обращается.