Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статус принтера, Получить статус принтера 
:(
    Опции темы
Denis
Дата 6.3.2014, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Пишу софтинку для самодельного терминала самообслуживания (бросил монетку, распечатал с флешки). Нужно мониторить статус (Замятие бумаги, закончилась бумага и пр.) USB принтера (HP 2055) для своевременного оповещения обслуживающего специалиста. Перерыл кучу материала, но идеального решения (В любой момент времени спросил - получил ответ) так и не нашел. Может всё-таки есть решение?
PM MAIL   Вверх
kami
Дата 6.3.2014, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Win32_Printer class WMI
параметр DetectedErrorState
Проще всего заюзать что-нибудь готовое для Delphi, например - gLibWMI
PM MAIL WWW   Вверх
Denis
Дата 11.3.2014, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Спасибо большое
З.Ы. Интересно то, что пару лет назад я уже юзал эти компоненты для программы сбора инфы о железе)))
PM MAIL   Вверх
Denis
Дата 18.9.2014, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Не хотел возвращаться к этой теме, но я так и не разобрался ни со стандартными функциями ни с библиотекой gLibWMI. Так что снова взываю к помощи. Вот код
Код

    Result := 0;
    DevName := Printer.Printers[6];
    if OpenPrinter(PChar(DevName),hPrinter,nil) then
    begin
      Count := 0;
      GetPrinter(hPrinter,6,nil,0,@Count);

      if Count > 0 then
      begin
        GetMem(PrinterInfo2,Count);
        GetPrinter(hPrinter,6,PrinterInfo2,Count,@Count);
        Result := PrinterInfo2.Status;

Результат работы которого всегда 0, независимо от состояния принтера. Пробовал получать PrinterInfo6, пробовал обращаться к разным принтерам, та же проблема. Что не так с кодом, подскажите?
PM MAIL   Вверх
CynicRus
Дата 19.9.2014, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: 1
Всего: 5



Вот такая штука у меня работает без проблем:
Код

function GetPrinterStatus(const APrinterIndex: Integer): DWORD;
var
  APrinterHandle: THandle;
  APrinterInfo: PPrinterInfo2;
  ABytesNeeded: DWORD;

function GetPrinterHandle: THandle;
const
  PrinterDefaults: TPrinterDefaults = (pDatatype: nil; pDevMode: nil; DesiredAccess: PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER);

var
  ADevice, ADriver, APort: array [0. MAX_PATH] of Char;
  hDeviceMode: THandle;
begin
  Printer.GetPrinter(ADevice, ADriver, APort, hDeviceMode);
  if not OpenPrinter(@ ADevice, Result, @ PrinterDefaults) then
    RaiseLastOSError;
end;

begin
  Result: = 0;
  APrinterHandle: = 0;
  try
    Printer.PrinterIndex: = APrinterIndex;
    APrinterHandle: = GetPrinterHandle;
    ABytesNeeded: = 0;
    if not WinSpool.GetPrinter(APrinterHandle, 2, nil, 0, @ ABytesNeeded) then
      if Windows.GetLastError and ERROR_INSUFFICIENT_BUFFER then
      RaiseLastOSError;
    GetMem(APrinterInfo, ABytesNeeded);
    try
      if not WinSpool.GetPrinter(APrinterHandle, 2, APrinterInfo, ABytesNeeded, @ ABytesNeeded) then
        RaiseLastOSError;
      Result: = APrinterInfo ^.Status;
    finally
      FreeMem(APrinterInfo);
    end;
  except
    on E: Exception do
    begin
      if APrinterHandle <> 0 then
        ClosePrinter(APrinterHandle);
      raise;
    end;
  end;
end;     


PS: а вот мой пример, писал в том году - работает под Win 7\XP на Delphi XE3: http://codes-sources.commentcamarche.net/s...oler-via-winapi

Это сообщение отредактировал(а) CynicRus - 19.9.2014, 21:00
PM MAIL   Вверх
Mr_Devil
Дата 29.11.2016, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Код

uses WinSpool;

procedure GetPrinterStatus(PrinterName: string; out PrinterStatus, PrinterJobs: Cardinal);
var
  BufferLength: Cardinal;
  Buffer: Pointer;
  PrinterInfo: PPrinterInfo2;
  hPrinter: THandle;
  PD: TPrinterDefaults;
begin
  PrinterStatus := MAXDWORD;
  ZeroMemory(@PD, SizeOf(PD));
  PD.DesiredAccess := PRINTER_ACCESS_USE;
  if OpenPrinter(PChar(PrinterName), hPrinter, @PD) then
  try
    GetPrinter(hPrinter, 2, nil, 0, @BufferLength);
    if GetLastError = ERROR_INSUFFICIENT_BUFFER then
    begin
      Buffer := AllocMem(BufferLength);
      try
        if GetPrinter(hPrinter, 2, Buffer, BufferLength, @BufferLength) then
        begin
          PrinterInfo := PPrinterInfo2(Buffer);

          PrinterStatus := PrinterInfo^.Status;

          // для распознавания автономного режима
          if (PrinterInfo^.Attributes and PRINTER_ATTRIBUTE_WORK_OFFLINE) > 0 then
            PrinterStatus := PrinterStatus or PRINTER_STATUS_OFFLINE;

          PrinterJobs := PrinterInfo^.cJobs;
        end
        else
          RaiseLastOSError;
      finally
        FreeMem(Buffer, BufferLength);
      end;
    end
    else
      RaiseLastOSError;
  finally
    ClosePrinter(hPrinter);
  end;
end;



Это сообщение отредактировал(а) Mr_Devil - 29.11.2016, 16:34
PM MAIL ICQ   Вверх
AndyL
Дата 12.7.2019, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.7.2019

Репутация: нет
Всего: нет



Здравствуйте! У меня та же проблема. При подключении по usb TPrinterInfo2.Status дает всегда 0. Можно только определить отключен ли принтер по атрибуту (PRINTER_ATTRIBUTE_WORK_OFFLINE). А как определить, что в принтере нет бумаги?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1203 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.