Процедура OvrInitEMS не имеет параметров. Она просто определяет, есть ли в ПЭВМ расширяемая память (EMS-память). Если есть, то далее процедура проверяет, установлена ли программа-драйвер этой памяти, работающая по стандарту LIM (EMS 4.0 и выше). Если и это условие выполняется, то оверлейный файл целиком загрузится в EMS и все операции по работе с оверлейными процедурами и функциями будут происходить в памяти. При этом программа начинает работать более быстро, так как операции чтения из памяти в память производятся гораздо быстрее, чем с диска в память (особенно при работе с дискетами). Вызов OvrInitEMS не является обязательным, и ни в коей мере не отменяет необходимости обычной предварительной инициализации администратора оверлеев. Неудача при попытке разместить OVR-файл в EMS-памяти не будет иметь никаких фатальных последствий, и программа будет работать так, как будто вызова OvrInitEMS не было. Переменная OvrResult при этом получит значения OvrNoEMSDriver или OvrNoEMSMemory. Последняя может возникнуть из-за того, что в EMS-памяти уже размещены кэш (cache) жесткого диска, виртуальный диск или что-нибудь иное.
При запуске процедуры OvrInitEMS в переменную OvrResult могут передаваться и другие ошибки: OvrError — если не было предварительного вызова OvrInit, и OvrIOError — если произошел сбой при переносе оверлейного файла с диска в EMS-память.
Приведенный на рис. 18.2 фрагмент основной программы показывает запуск администратора оверлеев и попытку использовать EMS-память с полной проверкой ошибок. {397}
VAR
ovr_name : PathStr; { полное имя оверлея на диске }
d : DirStr; { Типы объявлены в модуле DOS.}
n : NameStr;
е : ExtStr;
BEGIN
FSplit(ParamStr(0), d, n, e); { анализ имени ЕХЕ-файла }
ovr_name := d + n + '.OVR'; { построение имени .OVR }
REPEAT
OvrInit( ovr_name ); { запуск администратора }
if OvrResult = OvrNotFound { OVR-файл не найден }
then begin
WriteLn('Оверлейный файл не найден:',ovr_name);
Write ('Введите правильное имя файла: ');
ReadLn ( ovr_name )
end; {if}
UNTIL OvrResult <> OvrNotFound;
if OvrResult <> OvrOk { анализ прочих ошибок }
then begin
WriteLn('Ошибка администратора оверлеев ',
OvrResult);
RunError { останов программы }
end; {if}
OvrInitEMS; { попытка загрузки в EMS }
if OvrResult <> OvrOk then { анализ этой попытки }
then begin
case OvrResult of
OvrNoEMSDriver:Write('Драйвер EMS не установлен');
OvrNoEMSMemory:Write('Мало свободной EMS-памяти');
OvrIOError :Write('Ошибка чтения файла' );
end; {case}
Write( ' - EMS память не используется.' ) { итог }
end; {if}
{ Администратор инициализирован. Можно работать дальше }
...
END.