Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по функциям С++.doc
Скачиваний:
168
Добавлен:
02.05.2014
Размер:
3.57 Mб
Скачать

Harderr

-----------------------------------------------------------------

НазначениеУстанавливает обработчик ошибок оборудования.

Синтаксис void harderr(int(*fptr)());

Прототип вdos.h

Замечанияharderr устанавливает обработчик ошибок

оборудования для текущей программы. Этот обра-

ботчик включается, когда возникает прерывание 0

х24. (Смотри Руководство программиста MS-DOS

для ознакомления с прерываниями.)

Функция, на которую указывает fptr, будет выз-

вана, когда возникнет прерывание. Обработчик

будет вызван со следующими аргументами.

harderr(int errval,int ax,int bp,int si);

errval - код ошибки, помещенный в регистр DI

системой.

ax,bp и si - значения, установленные MS-DOS для

AX,BP,SI регистров соответственно.

* ax показывает, случилась ли ошибка диска или

другого устройства: если ax не отрицательно, то

ошибка на диске, иначе это ошибка устройства.

Для ошибок диска ax логически складывается с 0

x00FF и в результате получается номер диска (1=

А, 2=В и т.д.)

* bp и si указывают на заголовок драйвера оши-

бочного устройства (содержат сегмент адреса и

смещение соответствено).

Указанная функция не вызывается прямо. harderr

устанавливает обработчик прерываний DOS, кото-

рый и вызывает ее.

peek и peekb могут использоваться для получения

информации об устройстве из заголовка.

Обработчик может использовать вызов bdos 1 че-

рез 0хС, но все остальные вызовы bdos будут

подменены MS-DOS. В частности, любой из стан-

дартных вызовов ввода-вывода Си или эмулятора

UNIX не может быть использован.

Заголовок драйвера может не изменяться через

вызов poke или pokeb.

Обработчик должен возвращать 0 для игнорирова-

ния, 1 для новой попытки и 2 для аварийного

окончания.

ВозвращаемоеНет.

значение

ПереносимостьУникальна для MS-DOS.

Смотри также hаrderesume, hardretn, peek, poke

Пример

#include<stdio.h>

#include<dos.h>

#define DISPLAY_STRING 0x09

#define IGNORE 0

#define RETRY 1

#define ABORT 2

int handler(int errval,int ax,int bp,int si)

{

char msg[25]; int drive;

if (ax < 0) { /* ошибка устройства */

bdosptr(DISPLAY_STRING,"ошибка устройства$",

0);

hardretn(-1);

}

drive = (ax & 0x00F);

sprintf(msg,"ошибка диска на устройстве %c$",

'A' + drive);

bdosptr(DISPLAY_STRING,msg,0);

return(ABORT);

}

main()

{

harderr(handler);

printf("Убедитесь, что в дисководе A нет"

" диска\n");

printf("Нажмите по готовности любую"

" клавишу...");

getch();

printf("Попытка доступа к A\n");

fopen("A:ANY.FIL","r");

}

Результат выполнения программы

Убедитесь, что в дисководе A нет диска

Нажмите по готовности любую клавишу...

Попытка доступа к A

Ошибка диска на устройстве A

-----------------------------------------------------------------