<p>18.3 Инициализация работы оверлеев</p><p>18.3.1 Включение администратора оверлеев</p>

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

OvrInit(OvrFileName : String)

- 396 -

объявленной в модуле Overlay. Эта процедура проводит инициализацию и открывает оверлейный OVR-файл. Через параметр OvrFileName должно быть передано имя оверлейной части программы ( оно такое же, как и у основной части, но с расширением .OVR вместо .EXE). Если не производить действий по оптимизации работы администратора и не обрабатывать его возможные ошибки, то однократного вызова OvrInit достаточно для дальнейшей работы с оверлеями. Однако инициализация может закончиться ошибкой, и для ее анализа можно использовать специальную переменную модуля Overlay.

<p>18.3.2. Анализ результата инициализации</p>

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

Таблица 18.1

Константа

Ее смысл

OvrOk = 0

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

OvrError = -1

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

OvrNotFound = -2

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

OvrNoMemory = -3

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

OvrIOError = -4

Сбой при чтении оверлейного файла

OvrNoEMSDriver = -5

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

OvrNoEMSMemory = -6

Емкости EMS-памяти не достаточно

Ошибка OvrError обычно возникает при попытке инициализации неоверлейного файла. Другая ошибка, OvrNotFound, может возникнуть при неправильном размещении оверлейного файла на диске. Если в имени файла OvrFileName при инициализации не указан полный путь, то файл ищется сначала в текущем каталоге, затем в том же каталоге, где находится ЕХЕ-файл и во всех каталогах, которые указаны в системной переменной MS-DOS PATH. Если ни в одном из них файл не найден, то генерируется ошибка. Сама программа при этом продолжит свою работу до первой попытки вызвать процедуру или функцию, находящуюся в оверлейном файле, после чего остановится с выдачей кода фатальной ошибки выполнения 208 Overlay manager not installed («администратор оверлеев не установлен»). Чтобы избежать подобных неприятностей,

- 397 -

рекомендуем файлы .ЕХЕ и .OVR хранить в одном каталоге (что, собственно, и делает компилятор).

Еще одна ошибка инициализации, имеющая фатальные последствия, это OvrNoMemory. Ее появление свидетельствует либо о нехватке свободной памяти в ПЭВМ, либо о том, что самый крупный оверлейный модуль (а именно он определяет размер оверлейного буфера) следовало бы разбить на несколько независимых модулей.

Ошибка OvrIOError свидетельствует о возникшем сбое при чтении оверлейного кода из файла. Как правило, к ее появлению приводят внешние причины (повреждение файла, сбой внутри MS-DOS и т.п.).

Два последних кода ошибки (OvrNoEMSDriver и OvrNoEMSMemory) не могут быть выданы процедурой OvrInit. Они могут появиться при работе добавочной процедуры инициализации OvrInitEMS.

<p>18.3.3. Размещение оверлейного файла в EMS-памяти</p>

Процедура OvrInitEMS не имеет параметров. Она просто определяет, есть ли в ПЭВМ расширяемая память (EMS-память). Если есть, то далее процедура проверяет, установлена ли программа-драйвер этой памяти, работающая по стандарту LIM (EMS 4.0 и выше). Если и это условие выполняется, то оверлейный файл целиком загрузится в EMS и все операции по работе с оверлейными процедурами и функциями будут происходить в памяти. При этом программа начинает работать более быстро, так как операции чтения из памяти в память производятся гораздо быстрее, чем с диска в память (особенно при работе с дискетами). Вызов OvrInitEMS не является обязательным, и ни в коей мере не отменяет необходимости обычной предварительной инициализации администратора оверлеев. Неудача при попытке разместить OVR-файл в EMS-памяти не будет иметь никаких фатальных последствий, и программа будет работать так, как будто вызова OvrInitEMS не было. Переменная OvrResult при этом получит значения OvrNoEMSDriver или OvrNoEMSMemory. Последняя может возникнуть из-за того, что в EMS-памяти уже размещены кэш (cache) жесткого диска, виртуальный диск или что-нибудь иное.

Перейти на страницу:

Поиск

Похожие книги