MS-DOS для программиста

         

Программа CRITERR


Для демонстрации использования функций установки обработчика критических ошибок приведем программу, которая пытается создать каталог на диске А:. Эта программа сама обрабатывает критические ошибки, запрашивая у оператора информацию о необходимых действиях.

Листинг 3.8. Файл criterr\criterr.cpp

// Эту программу можно запускать только из командной // строки. При запуске из интегрированной среды // Borland C++ возможен конфликт с используемым в этих // средах обработчиком критических ошибок

#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <direct.h> #include <string.h> #include <dos.h> #include <bios.h>

void far hhandler(unsigned deverr, unsigned doserr, unsigned far *hdr); void _bios_str(char *p);

int main() { // Устанавливаем обработчик критических ошибок _harderr (hhandler);

// Моделируем критическую ошибку. // Выполняем попытку создать каталог на диске А:. // Если мы "забудем" вставить в дисковод // дискету, будет вызван обработчик // критической ошибки printf("\nВставьте (или не вставляйте) " "дискету в дисковод A:" "\nи нажмите любую клавишу...\n"); getch();

// Создаем каталог if(mkdir ("a:\\test_ctl")) { printf("\nОшибка при создании каталога"); return(-1); } else { // Удаляем только что созданный каталог rmdir ("a:test_ctl"); } return 0; }

// Новый обработчик критических ошибок #pragma argsused void far hhandler(unsigned deverr, unsigned doserr, unsigned far *hdr) { int ch; static char buf[200];

// Выводим сообщение о критической ошибке sprintf(buf,"\n\r" "\n\rКод ошибки устройтсва: %04.4X" "\n\rКод ошибки DOS: %d" "\n\r\n\r" "\n\rВыполняемые действия:" "\n\r 0 - повторить" "\n\r 1 - отменить" "\n\r 2 - завершить" "\n\r----> ?", deverr, doserr);

_bios_str(buf);

// Вводим ответ с клавиатуры ch = _bios_keybrd(_KEYBRD_READ) & 0x00ff; _bios_str("\n\r");

switch(ch) { case '0': // Пытаемся повторить операцию default: _hardresume (_HARDERR_RETRY);

case '2': // Завершаем работу программы _hardresume (_HARDERR_ABORT);

case '1': // Возврат в DOS с кодом ошибки _hardretn (doserr); } }

// Программа для вывода строки символов на экран // с помощью функции BIOS 0Eh void _bios_str(char *ptr) { union REGS inregs, outregs;

inregs.h.ah = 0x0e; for(; *ptr; ptr++) { inregs.h.al = *ptr; int86(0x10, &inregs, &outregs); } }



Содержание раздела