18.3 Инициализация работы оверлеев
18.3.1 Включение администратора оверлеев
Программа с оверлеями должна обязательно включать (инициализировать) администратор оверлеев перед первым обращение к какой-либо подпрограмме, хранящейся в OVR-файле. В минимальном случае для этого достаточно одного оператора. Включение должно происходить только один раз за время работы программы. Оно производится при вызове процедуры
OvrInit(OvrFileName : String)
- 396 -
объявленной в модуле Overlay. Эта процедура проводит инициализацию и открывает оверлейный OVR-файл. Через параметр OvrFileName должно быть передано имя оверлейной части программы ( оно такое же, как и у основной части, но с расширением .OVR вместо .EXE). Если не производить действий по оптимизации работы администратора и не обрабатывать его возможные ошибки, то однократного вызова OvrInit достаточно для дальнейшей работы с оверлеями. Однако инициализация может закончиться ошибкой, и для ее анализа можно использовать специальную переменную модуля Overlay.
18.3.2. Анализ результата инициализации
Предопределенная в модуле 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.
18.3.3. Размещение оверлейного файла в EMS-памяти
Процедура OvrInitEMS не имеет параметров. Она просто определяет, есть ли в ПЭВМ расширяемая память (EMS-память). Если есть, то далее процедура проверяет, установлена ли программа-драйвер этой памяти, работающая по стандарту LIM (EMS 4.0 и выше). Если и это условие выполняется, то оверлейный файл целиком загрузится в EMS и все операции по работе с оверлейными процедурами и функциями будут происходить в памяти. При этом программа начинает работать более быстро, так как операции чтения из памяти в память производятся гораздо быстрее, чем с диска в память (особенно при работе с дискетами). Вызов OvrInitEMS не является обязательным, и ни в коей мере не отменяет необходимости обычной предварительной инициализации администратора оверлеев. Неудача при попытке разместить OVR-файл в EMS-памяти не будет иметь никаких фатальных последствий, и программа будет работать так, как будто вызова OvrInitEMS не было. Переменная OvrResult при этом получит значения OvrNoEMSDriver или OvrNoEMSMemory. Последняя может возникнуть из-за того, что в EMS-памяти уже размещены кэш (cache) жесткого диска, виртуальный диск или что-нибудь иное.