При запуске процедуры OvrInitEMS в переменную OvrResult могут передаваться и другие ошибки: OvrError — если не было предварительного вызова OvrInit, и OvrIOError — если произошел сбой при переносе оверлейного файла с диска в EMS-память.

Приведенный на рис. 18.2 фрагмент основной программы показывает запуск администратора оверлеев и попытку использовать EMS-память с полной проверкой ошибок.

- 398 -

| 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.

Рис. 18.2

<p>18.4. Управление оверлейным буфером</p>

Для «ручного» управления размерами оверлейного буфера, который обычно назначается автоматически, и его очистки в модуле Overlay введены специальная функция

OvrGetBuf : LongInt

- 399 -

и процедуры

OvrSetBuf(Size : LongInt)

и

OvrClearBuf.

<p>18.4.1. Опрос размера буфера</p>

Функция OvrGetBuf возвращает размер текущего буфера в байтах. Ее значения в некоторых случаях могут превышать 64К, поэтому она описана как LongInt. В специальных случаях можно пользоваться предопределенной переменной модуля System OvrHeapSize типа Word, хранящей начальное значение оверлейного буфера.

<p>18.4.2. Установка размера буфера</p>

Процедура OvrSetBuf (Size : LongInt) регулирует размер буфера. Она должна вызываться после инициализации администратора оверлеев процедурами OvrInit и OvrInitEMS. В параметре Size задается требуемая величина буфера в байтах. Она должна быть больше или равна начальному размеру буфера и не превышать размер всей доступной памяти, который можно вычислить как (MaxAvail + стартовое значение OvrGetBuf).

Вообще говоря, при инициализации администратора оверлеев под оверлеи автоматически выделяется ровно столько памяти, сколько необходимо для загрузки наибольшего оверлейного модуля. Если значение Size больше текущего размера буфера, то дополнительный объем выделяется из кучи. Если же меньше, то ненужная часть буфера присоединяется к куче. У процедуры OvrSetBuf есть одна особенность: она проверяет состояние области кучи. Если она пуста, то процедура работает без ошибок. Если же в этой области уже были размещены динамические переменные (процедурами New или GetMem), то в OvrResult будет возвращена ошибка OvrError. Эта же ошибка будет возвращена, если значение Size слишком мало или если не была проведена инициализации администратора оверлеев.

Возможная ошибка, OvrNoMemory, говорит о том, что не хватает памяти для увеличения размера буфера. Это может быть из-за наличия в программе директивы распределения памяти типа {$М 16384, 0, 655360}. В этом случае необходимо указать минимальный размер кучи, не меньший чем максимальное приращение к оверлейному буферу, например {$М 16384, 65536, 655360}.

- 400 -

Наиболее удобно менять размер буфера относительно текущего значения. Пусть надо увеличить его размер на 2048 байт. Это можно проделать вызовом

OvrSetBuf( OvrGetBuf + 2048 ).

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

Поиск

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