18.6. Предопределенные переменные для работы с оверлеями
Мы рассматривали переменную модуля Overlay OvrResult с набором констант-значений (см. разд. 18.3.2) и переменные OvrTrapCount и OvrLoadCount (разд. 18.5.2). Кроме них, определены еще тип и две переменные:
TYPE
OvrReadFunc = Function( OvrSeg : Word ) : Integer;
VAR
OvrReadBuf : OvrReadFunc;
OvrFileMode : Byte;
Переменная OvrReadBuf предназначена для перехвата операции загрузки оверлея и позволяет устанавливать собственную функцию чтения и проверки оверлейных файлов. Это может понадобиться, например, в случае необходимости проверки наличия сменного диска. Когда администратору оверлеев нужно прочитать очередной сегмент, он вызывает функцию, адрес которой хранится в переменной OvrReadFunc. Если эта функция возвращает нуль, то считается, что операция чтения прошла успешно. Если не нуль,то системой генерируется код фатальной ошибки номер 209 Overlay file read error («Ошибка чтения файла оверлея»). Параметр OvrSeg указывает, какой сегмент должен быть загружен. Однако, в силу того что имя сегмента неявно передается в эту функцию процедурой OvrInit, его можно считать предопределенным.
Для установки собственной процедуры проверки загрузки оверлея необходимо проделать следующее:
1) описать в основной программе собственную функцию обработки чтения оверлея из OVR-файла с заголовком, соответствующим типу OvrReadFunc, и убедиться, что она будет компилироваться в режиме {$F+}. Внутри этой функции после всех предварительных проверок должен стоять вызов основной (сохраненной) функции чтения оверлея. После этого можно производить обработку ошибок;
2) запомнить (сохранить) в программе стартовое значение переменной OvrReadBuf;
3) присвоить переменной OvrReadBuf адрес собственной функции обработки чтения файла.
- 403 -
Внимание! Из собственной функции чтения оверлея никогда не должен производиться вызов какой-либо оверлейной подпрограммы. Если же это требование будет нарушено, то придется затратить несколько лишних минут на перезагрузку MS-DOS и восстановение состояния среды программирования.
Сама подстановка функции чтения оверлея должна находиться сразу за вызовом процедуры OvrInit.
Переменная OvrFileMode определяет код доступа при открытии оверлейного файла. По умолчанию код доступа соответствует режиму «только чтение». Для того чтобы изменить код доступа, необходимо перед инициализацией оверлеев присвоить новое значение этой переменной, о котором можно справиться в технических руководствах по MS-DOS. Реальная необходимость в этом может возникнуть, пожалуй, только при работе в локальных сетях ПЭВМ.
Для работы с оверлеями предназначены и некоторые специальные переменные модуля System, объявленные как переменные со стартовым значением:
CONST
OvrCodeList : Word =0; { список сегментов кодов }
OvrHeapSize : Word =0; { стартовый размер буфера }
OvrDebugPtr : Pointer=nil; { зарезервировано для отладчика }
OvrHeapOrg : Word =0; { сегмент начала буфера }
OvrHeapPtr : Word =0; { указатель заполнения буфера }
OvrHeapEnd : Word =0; { сегмент конца буфера }
OvrLoadList : Word =0; { используется администратором }
OvrDosHandle : Word =0; { используется администратором }
OvrEMSHandle : Word =0; { используется администратором }
Они предназначены в основном для обслуживания системных запросов администратора оверлеев, и не стоит экспериментировать с их значениями. Реально можно использовать лишь переменные, описывающие буфер (см. разд. 18.4.3).