Лазерный принтер. Вытащить статистику.
От: nixon11  
Дата: 17.03.06 12:08
Оценка:
Я в раздел по железу постил но видимо вопрос сюда.

Есть принтер+сканер HP LaserJet 1220. Подключен по LPT.Windows XP Pro SP2.
При нажатии кнопки печати пробной страницы — он печатает
пробную страницу в которой указаны числа:
— число распечатанных
— число отсканированных
Как достучатся до этих чисел? В какую сторону копать? Спасибо!
Re: Лазерный принтер. Вытащить статистику.
От: Vovik1982 Россия  
Дата: 17.03.06 12:32
Оценка:
Копать скорее всего в сторону SendDriverMessage, OpenDriver и им подобных. Смотри в MSDN соответствующий раздел. Но не факт, что эти данные доступны...
Re: Лазерный принтер. Вытащить статистику.
От: Rothmans  
Дата: 18.03.06 10:55
Оценка:
Здравствуйте, nixon11, Вы писали:

N>Я в раздел по железу постил но видимо вопрос сюда.


N>Есть принтер+сканер HP LaserJet 1220. Подключен по LPT.Windows XP Pro SP2.

N>При нажатии кнопки печати пробной страницы — он печатает
N>пробную страницу в которой указаны числа:
N>- число распечатанных
N>- число отсканированных
N>Как достучатся до этих чисел? В какую сторону копать? Спасибо!

Если принтер поддерживает PJL (скорее всего это так), то единственным известным мне методом достучаться до этих переменных -- это отправка принтеру PJL команд и чтение результата.
Но чтение не так просто сделать, условием является поддержка драйвером принтера "bidirectional mode" (галочка bidirectional support в pritner properties -> ports должна быть незадисейблена и отмечена), для чего драйвер должен иметь langiage monitor, поддерживающий чтение readback данных принтера.
Значит, предположив что все условия соблюдаются, могу порекомендовать покопать в два направления:
1) стандартная последовательность, рекомендуемая MSDN:
OpenPrinter -> StartDocPrinter -> StartPagePrinter -> WritePrinter (тут пишешь нужную PJL команду в принтер) -> ReadPrinter (тут читаешь ответ и парсишь его) -> EndPagePrinter -> EndDocPrinter -> ClosePrinter
Честно сказать, мне не удалось считать что-либо с моих принтеров, используя этот подход, ReadPrinter постоянно возвращает Invalid Handle, думаю, что у меня проблема с драйверами.
2) использовать CreateFile -> WriteFile -> ReadFile, можно также читать асинхронно. Этот подход является своего рода хаком, потому что обходит спулер и в общем случае может покорежить распечатываемые данные на принтере, если кто-то будет печатать одновременно с чтением данным с принтера, уменьшить разрушительный эффект этого можно временно ставя принтеры, подключенные к целевому порту на паузу, а после чтения снова активируя их. Подход также имеет недостатки для LPT принтеров (USB вроде не подвержены такому недостатку, по крайне мере принтеры, подключенные через Standard USB printing support порт монитор). Поскольку спулер (а точнее порт печати на LPT Local Monitor) открывают и держат открытым хэндл на устройство "LPT1:", а драйвер хардварного LPT порта отдает этот хэндл ТОЛЬКО в эксклюзивном режиме (т.е. его можно открыть только один раз), то пока в системе есть принтеры, приатаченные к LPT порту, CreateFile("\\\\LPT1") не сработает, т.е. перед чтением надо временно детачить принтеры, подключенные к LPT порту (SetPrinter()).

Есть еще третий вариант: написать свой language monitor с которым и общаться напрямую.

Да и еще. Число "отсканированных страниц" наводит на мысль, что у тебя мульти-функциональное устройство. Это значит что, чтобы получить именно это значение тебе не удастся обойтись чистым PJL. Тебе повезет, если HP расширили PJL чтобы обращаться к настройкам сканера и ты узнаешь спецификацию этого расширеня или же принтер поддерживает специальный протокол по LPT интерфейсу (отличный от PJL), позволяющий получить любую инфу о принтере. Иногда это что-то предоставляет доступ к переменнм SNMP агента прямо по OID-ам или использует свой собственный, разработанный производителем принтера протокол.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.