7.4. Средства MS-DOS для работы с принтером


Для печати символа на стандартном печатающем устройстве LPT1 (он же PRN) вы можете использовать функцию 05h прерывания MS-DOS INT 21h: На входе: AH = 05h; DL = ASCII-код символа для печати. На выходе: AH = слово состояния принтера (см. ниже).

Команда MS-DOS MODE может переназначить стандартное устройство печати LPT1 на асинхронный последовательный порт: MODE LPT1:=COM1

Мы подготовили еще одну программу распечатки содержимого файла, но уже при помощи прерывания MS-DOS: #include <dos.h> #include <stdio.h> union REGS rg; int main(int argc, char *argv[]) { FILE *srcfile; // Открываем файл, заданный первым параметром // в командной строке. // Если при запуске программы оператор забыл // указать имя файла, выводим напоминающее сообщение. if( (srcfile = fopen( argv[1], "rb" )) == NULL ) { printf("\nЗадайте имя файла в качестве параметра"); exit(-1); } // Читаем файл по одному символу, полученный из файла // символ выводим на принтер при помощи функции printchar(). for(;;) { printchar(fgetc(srcfile)); if(feof(srcfile)) break; } // Закрываем файл. fclose(srcfile); } // ------------------------------------ // Эта функция выводит один символ // на стандартный принтер (LPT1) // ------------------------------------ int printchar(int chr) { // Дублируем распечатываемый символ на экране putch(chr); // Вызываем функцию 5 прерывания INT 21h - // распечатка символа на принтере. rg.h.ah = 5; rg.h.dl = chr; int86(0x21, &rg, &rg); }

Заметьте, что функция 05h прерывания INT 21h не возвращает состояния принтера при ошибке ввода/вывода. Вместо этого вызывается стандартный обработчик критических ошибок MS-DOS, который выводит на экран хорошо знакомое вам сообщение: Write fault error writing device PRN Abort, Retry, Ignore, Fail?

Вы можете ответить Retry, нажав клавишу "R", тогда MS-DOS выполнит попытку повторить печать символа. Если ответить Abort (нажав клавишу "A"), MS-DOS завершит работу вашей программы.

Поэтому приведенная выше программа не содержит обработчика ошибочных ситуаций error(). Если вас не устраивают действия, выполняемые стандартным обработчиком критических ошибок MS-DOS, вы можете составить собственный. В третьей книге первого тома "Библиотеки системного программиста" мы рассказывали вам о создании и подключении собственного обработчика критических ошибок.

Более интересные возможности по управлению процессом печати предоставляет программа резидентного спулера печати PRINT.COM. Вы знаете, что команда PRINT предназначена для выполнения печати в фоновом режиме.

Оказывается, что если запущена программа PRINT, другие программы могут взаимодействовать с ней, управляя процессом печати.

Для связи со спулером печати можно использовать несколько функций прерывания INT 2Fh: На входе: AH = 01h; AL = номер выполняемой операции. На выходе: AH = 00 - спулер печати не установлен, но его можно установить, запустив программу PRINT; 01 - спулер печати не установлен и его установка невозможна (система не содержит ни одного принтера); FFh - спулер установлен.

Приведем форматы регистров для выполнения различных операций со спулером печати. На входе: AH = 01h; AL = 0 - проверить установку спулера печати. На выходе: AH = 00 - спулер печати не установлен, но его можно установить, запустив программу PRINT; 01 - спулер печати не установлен и его установка невозможна; FFh - спулер установлен. На входе: AH = 01h; AL = 1 - передача файла спулеру для печати; DS:DX = адрес управляющего блока: Смещение Длина (+0) 1 уровень запроса, равен 0; (+1) 4 FAR-адрес строки в формате ASCIIZ, содержащей путь файла. На выходе: AH = 00 - спулер печати не установлен, но его можно установить, запустив программу PRINT; 01 - спулер печати не установлен и его установка невозможна; FFh - спулер установлен. На входе: AH = 01h; AL = 2 - отменить печать файла; DS:DX = адрес строки в формате ASCIIZ, содержащей имя файла, удаляемого из очереди для печати. На выходе: AH = 00 - спулер печати не установлен, но его можно установить, запустив программу PRINT; 01 - спулер печати не установлен и его установка невозможна; FFh - спулер установлен. На входе: AH = 01h; AL = 3 - отменить печать всех файлов. На выходе: AH = 00 - спулер печати не установлен, но его можно установить, запустив программу PRINT; 01 - спулер печати не установлен и его установка невозможна; FFh - спулер установлен. На входе: AH = 01h; AL = 4 - определить состояние спулера и заблокировать спулер. На выходе: DS:SI = адрес очереди печати (массив строк в формате ASCIIZ, конец массива отмечен строкой, состоящей из 0; DX = количество ошибок при попытке напечатать последний символ; AH = 00 - спулер печати не установлен, но его можно установить, запустив программу PRINT; 01 - спулер печати не установлен и его установка невозможна; FFh - спулер установлен. На входе: AH = 01h; AL = 5 - разблокировать спулер для продолжения печати. На выходе: AH = 00 - спулер печати не установлен, но его можно установить, запустив программу PRINT; 01 - спулер печати не установлен и его установка невозможна; FFh - спулер установлен.

Если после вызова перечисленных выше функций флаг переноса CF установлен в 1, регистр AX содержит код ошибки:

  • 1
  • Неправильный код функции
  • 2
  • Файл не найден
  • 3
  • Путь не найден
  • 4
  • Слишком много открытых файлов
  • 5
  • Доступ запрещен
  • 6
  • Неправильный индекс (handle)
  • 8
  • Переполнение очереди
  • 9
  • Занято
  • 0Ch
  • Слишком длинный путь и имя файла (больше 64 байтов)
  • 0Fh
  • Неправильное определение диска



Содержание Назад Вперед