Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Teoria 158783 .doc
Скачиваний:
6
Добавлен:
25.09.2019
Размер:
1.72 Mб
Скачать

Инициализация работы оверлеев

В модуле Overlay определены процедуры OvrInit, OvrInitEMS, OvrSetBuf, OvrClearBuf, OvrSetRetry и функции OvrGetBuf и OvrGetRetry.

Включение администратора оверлеев

Перед первым обращением к какой-либо подпрограмме, хранящейся в Ovr-файле, в программе необходимо включить (инициализировать) администратор оверлеев. Включение производится один раз. Для этого служит процедура OvrInit. Заголовок процедуры имеет вид:

OvrInit (OvrFileName: String),

Данная процедура определена в модуле Overlay. Процедура производит инициализацию администратора оверлеев и открывает оверлейный файл, имя которого определяет параметр OvrFileName (имя файла должно быть тем же, что у файла, содержащего основную часть программы, но с расширением ovr). Вызова процедуры OvrInit в принципе достаточно, чтобы работать с оверлеями (если не оптимизировать работу администратора и не обрабатывать его возможные ошибки).

Обработка ошибок администратора

В модуле Overlay определена переменная OvrResult типа Integer. В данной переменной сохраняются коды завершения процедур и функций модуля Overlay. Определено семь возможных значений OvrResult. Для каждого из них предопределена константа (Таблица 8 .3).

Таблица 8.3 – Коды завершения процедур и функций модуля Overlay

Константа

Значение

Описание

OvrOk

0

Нормальное завершение

OvrError

-1

Ошибка управления Overlay

OvrNotFound

-2

Файл .ovr не найден

OvrNoMemory

-3

Не хватает памяти для буфера оверлеев

OvrIOError

-4

Ошибка ввода-вывода оверлейного файла

OvrNoEMSDriver

-5

Драйвер EMS не установлен

OvrNoEMSMemory

-6

Недостаточно EMS памяти

Ошибка OvrError возникает при попытке инициализации неоверлейного файла.

Ошибка OvrNotFound возникает при неправильном размещении оверлейного файла на диске. Если в фактическом параметре OvrFileName процедуры OvrInit не указан полный путь, то файл ищется в текущем каталоге, затем в каталоге, где находится ехе-файл и в каталогах, указанных в системной переменной MS-DOS Path. Если в этих каталогах файл не найден, генерируется ошибка OvrNotFound и осуществляется останов программы (ошибка выполнения 208 «Администратор оверлеев не установлен»).

OvrNoMemory появляется при нехватке свободной памяти в компьютере или если самый крупный оверлейный модуль (он определяет размер оверлейного буфера) следует разбить на несколько независимых модулей.

OvrIOError обычно свидетельствует о сбое при вводе-выводе оверлейного файла или о повреждении оверлейного файла.

Все вышеназванные ошибки могут появляться при инициализации администратора.

Две последние ошибки могут появиться при работе процедуры инициализации OvrInitEMS.

Переменная OvrResult подобна стандартной функции IOResult за исключением того, что OvrResult не устанавливается в ноль при обращении к ней.

Константы ошибок могут быть использованы для анализа ошибок после инициализации администратора; например, с помощью операторов вида:

If OvrResult = OvrNotFound

или

If OvrResult <> OvrOk Then

Case OvrResult of

OvrIOError:…

OvrNoEMSDriver:…

и т.д.

Пример 8.2.

Простейшая оверлейная программа. Пусть исходный текст программы хранится в файле OvrDemo.pas.

Program OvrDemo; {Главная программа}

{$F+}

Uses Overlay, Crt, Unit1, Unit2;

{$O Unit1}

{$O Unit2}

Begin

OvrInit (‘OvrDemo.ovr’);

If OvrResult <> 0 Then {или OvrResult <> OvrOk}

Begin

Writeln (‘Ошибка инициализации:’, OvrResult);

<Обработка ошибки инициализации> {например, Halt (1); где 1 –

код выхода из программы

(необязательный параметр,

по умолчанию Halt (0))}

End;

Repeat

Write1;

Write2;

Until KeyРressed; {Функция возвращает значение True,

если была нажата клавиша

клавиатуры. Определена в CRT}

End. {Конец главной программы}

{$O+, F+} {1-ый оверлейный сегмент Unit1}

Unit Unit1;

Interface

Procedure Write1;

Implementation

Procedure Write1;

Begin

Writeln (‘1-ый оверлей’);

End;

End. {Конец Unit1}

{$O+, F+} {2-ой оверлейный сегмент Unit2}

Unit Unit2;

Interface

Procedure Write2;

Implementation

Uses Unit1;

Procedure Write2;

Begin

Writeln (‘2-ой оверлей’);

Writeln (‘А теперь снова’);

Write1;

Writeln (‘Конец второго оверлея’);

End;

End. {Конец Unit2}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]