Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как получить статус принтера

Delphi , ОС и Железо , Принтеры и Печать

Как получить статус принтера

Автор: http://www.swissdelphicenter.ch

function TestPrinterStatus(LPTPort: Word): Byte;
var
  Status: byte;
  CheckLPT: word;
begin
  Status := 0;
  if (LPTPort >= 1) and (LPTPort <= 3) then
  begin
    CheckLPT := LPTPort - 1;
    asm
      mov dx, CheckLPT;
      mov al, 0;
      mov ah, 2;
      int 17h;
      mov &Status, ah;
    end;
  end;
  Result := Status;
end;

{
  Pass in the LPT port number you want to check & get the following back:
  01h - Timeout
  08h - I/O Error
  10h - Printer selected
  20h - Out of paper
  40h - Printer acknowledgement
  80h - Printer not busy (0 if busy)

  Note:
  This function doesn't work under NT, it gives an access violation
  from the DOS interrupt call.
 }

Перевод контента на русский язык:

Код Delphi используется для проверки статуса принтера, подключенного к порту LPT (параллельный порт). Номер порта LPT должен быть передан в функцию TestPrinterStatus как аргумент.

Функция использует ассемблерный язык для отправки BIOS-интеррумпции (интеррумпция 17h) для запроса статуса принтера. Интеррумпция требует двух параметров: номер порта LPT и байт для команды (al = 0, ah = 2).

Возможные возвращаемые значения функции:

  • 01h - Timeout
  • 08h - I/О Error
  • 10h - Printer selected
  • 20h - Out of paper
  • 40h - Printer acknowledgement
  • 80h - Printer not busy (0 if busy)

Обратите внимание, что это код не работает под Windows NT, потому что вызов DOS-интеррумпции не поддерживается в NT.

Детальное объяснение кода:

  1. Функция TestPrinterStatus принимает один аргумент, LPTPort, который является номером порта LPT для проверки (1-3).
  2. Она инициализирует переменную Status в 0.
  3. Если LPTPort находится между 1 и 3, она рассчитывает фактический номер порта LPT, вычитав 1 из LPTPort.
  4. Ассемблерный код внутри функции использует расчетанный номер порта LPT и отправляет интеррумпцию (17h) BIOS с al = 0 и ah = 2.
  5. BIOS возвращает статус принтера в регистре ah, который хранится в переменной Status.
  6. Наконец, функция возвращает значение Status.

Возможная альтернативная решени:

Вы можете использовать Windows API-функцию GetPrinterDC для получения handle к контексту устройства принтера и функцию GetPrinterState для получения текущего состояния принтера.

Вот пример, как это можно сделать в Delphi:

function GetPrinterStatus(LPTPort: Integer): Byte;
var
  hPrinterDC: THandle;
  dwPrinterState: DWORD;
begin
   // Откройте контекст устройства принтера
  hPrinterDC := OpenPrinter(LPTPort, GENERIC_READ or GENERIC_WRITE, nil);
  if hPrinterDC = 0 then
    Result := -1  // Ошибка открытия принтера

   // Получите текущее состояние принтера
  dwPrinterState := GetPrinterState(hPrinterDC);

   // Преобразуйте состояние принтера в байтовое значение
  case dwPrinterState and PRINTER_STATE of
    PRINTER_STATE_ONLINE: Result := $80;  // Принтер не занят
    PRINTER_STATE_OFFLINE: Result := $40;  // Акцепт принтера
    PRINTER_STATE_PAUSED: Result := $20;  // Папка закончилась
    PRINTER_STATE_ERROR: Result := $08;  // Ошибка ввода-вывода
    else Result := 0;  // Неизвестное состояние
  end;

  ClosePrinter(hPrinterDC);
end;

Этот код более платформо-независим, чем оригинальный код, и работает под Windows NT. Однако важно отметить, что он предоставляет ограниченный набор информации о состоянии принтера по сравнению с оригинальным кодом.

Статья описывает функцию TestPrinterStatus, которая позволяет получить статус принтера по номеру порта LPT, используя байт, который может содержать коды ошибок или статуса принтера.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Принтеры и Печать ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:33:00/0.0039458274841309/0