Kak proverit status printera
От: Hobbit  
Дата: 12.08.02 22:44
Оценка:
Privet,
Podskajite pojaluista kak mojno proverit status printera v NT (2000,XP) vrode "out of paper", "offline" i tak dalee, ne posilaia stranichku v print.
Pasiba
Re: Kak proverit status printera
От: iLYA Канада http://www.bizon.org/ilya/
Дата: 13.08.02 04:13
Оценка: -1
Здравствуйте Hobbit, Вы писали:

H>Privet,

H>Podskajite pojaluista kak mojno proverit status printera v NT (2000,XP) vrode "out of paper", "offline" i tak dalee, ne posilaia stranichku v print.
H>Pasiba:)

Прю...
Смотри в сторону GetJob и на структуру JOB_INFO_2

Удачи,
iLYA
Re[2]: Kak proverit status printera
От: Hobbit  
Дата: 13.08.02 14:20
Оценка:
Здравствуйте iLYA , Вы писали:



I>Прю...

I>Смотри в сторону GetJob и на структуру JOB_INFO_2

I>Удачи,

I>iLYA


Delo v tom chto ia v etu storonu smotrel. No poluchaetsia chto ia doljen poslat stranizu v pechat i posle etogo esli vo vremia pechati idet oshibka ia ee i poluchau cherez GetJob i JOB_INFO_2.

Mojno li kak to poslat "fake" job i poluchit informaziu cherez etot "fake" job? T.e. ne dojidaias poka printer poprobuet sobstvenno otpechatat stranizu.

Bolshoe Spasibo

Hobbit
Re: Kak proverit status printera
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.08.02 17:43
Оценка: 21 (1)
Здравствуйте Hobbit, Вы писали:

H>Privet,

H>Podskajite pojaluista kak mojno proverit status printera v NT (2000,XP) vrode "out of paper", "offline" i tak dalee, ne posilaia stranichku v print.
H>Pasiba:)

 LPTSTR pszDefPrintName = "\\\\LPT\\hplj2100"; // Это я прописал свой принтер. Надо, ессно, указывать свой.
        /*new char[nameBufSize]; // Не работает в виндах младше 2000.
   if (GetDefaultPrinter(pszDefPrintName, &nameBufSize))
   {*/
      HANDLE hPrinter;
      if (OpenPrinter(pszDefPrintName, &hPrinter, NULL))
      {
         unsigned char* buffer;
         DWORD cbNeeded;
         GetPrinter(hPrinter, 2, NULL, 0,  &cbNeeded);
         buffer = new unsigned char[cbNeeded];
         if(GetPrinter(hPrinter, 2, buffer, cbNeeded,  &cbNeeded))
         {
            CString status = "";
            switch (PPRINTER_INFO_2(buffer)->Status)
            {
            case PRINTER_STATUS_PAUSED            : status += "Paused;";
            case PRINTER_STATUS_ERROR             : status += "Error;";
            case PRINTER_STATUS_PENDING_DELETION  : status += "Pending Deletion;";
            case PRINTER_STATUS_PAPER_JAM         : status += "Paper Jam;";
            case PRINTER_STATUS_PAPER_OUT         : status += "Paper Out;";
            case PRINTER_STATUS_MANUAL_FEED       : status += "Manual Feed;";
            case PRINTER_STATUS_PAPER_PROBLEM     : status += "Paper Problem;";
            case PRINTER_STATUS_OFFLINE           : status += "Offline;";
            case PRINTER_STATUS_IO_ACTIVE         : status += "I/O Active;";
            case PRINTER_STATUS_BUSY              : status += "Busy;";
            case PRINTER_STATUS_PRINTING          : status += "Printing;";
            case PRINTER_STATUS_OUTPUT_BIN_FULL   : status += "Output Bin Full;";
            case PRINTER_STATUS_NOT_AVAILABLE     : status += "Not Available;";
            case PRINTER_STATUS_WAITING           : status += "Waiting;";
            case PRINTER_STATUS_PROCESSING        : status += "Processing;";
            case PRINTER_STATUS_INITIALIZING      : status += "Initializing;";
            case PRINTER_STATUS_WARMING_UP        : status += "Warming Up;";
            case PRINTER_STATUS_TONER_LOW         : status += "Toner Low;";
            case PRINTER_STATUS_NO_TONER          : status += "No Toner;";
            case PRINTER_STATUS_PAGE_PUNT         : status += "Page is Too Complex;";
            case PRINTER_STATUS_USER_INTERVENTION : status += "User Intervention;";
            case PRINTER_STATUS_OUT_OF_MEMORY     : status += "Out of Memory;";
            case PRINTER_STATUS_DOOR_OPEN         : status += "Door Open;";
            case PRINTER_STATUS_SERVER_UNKNOWN    : status += "Server Unknown;";
            case PRINTER_STATUS_POWER_SAVE        : status += "Power Save Mode;";
            }
            MessageBox(status);
         } else cbNeeded = GetLastError();
         delete[] buffer;
         ClosePrinter(hPrinter);
      };
//   };
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Kak proverit status printera
От: Hobbit  
Дата: 13.08.02 18:34
Оценка:
Здравствуйте Sinclair,

Bolshoe spasibo za otvet-ia proboval chto-to podobnoe ( ispolzuia te je samie API) v VB. Delo v tom chto vse communicazii idut cherez spooler-a spooler raportuet printer kak "ready" v lubom sluchae, esli tolko status printera ne obnovilsia vo vremia pechati odnoi is "jobs". Tak chto u menia etot code jelaemih resultatov ne dal.

Hobbit
Re[3]: Kak proverit status printera
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.08.02 19:07
Оценка:
Здравствуйте Hobbit, Вы писали:

H>Здравствуйте Sinclair,


H> Bolshoe spasibo za otvet-ia proboval chto-to podobnoe ( ispolzuia te je samie API) v VB. Delo v tom chto vse communicazii idut cherez spooler-a spooler raportuet printer kak "ready" v lubom sluchae, esli tolko status printera ne obnovilsia vo vremia pechati odnoi is "jobs". Tak chto u menia etot code jelaemih resultatov ne dal.


H> Hobbit


Хм. Честно говоря, я этот код за полчаса чтения MSDN накропал — у меня он выдает 0 по всем статусам для ремотного принтера. Хотя тот вроде неисправен. Но его и експлорер показывает как Ready.

В общем, я вижу два варианта:
1. Это косяк винды, и он непреодолим в рамках Win32
2. попробовать порыть в сторону FlushPrinter и ResetPrinter, начав со второй. Первую я вообще-то не понял, т.к. неясно, что за данные надо запихивать в принтер, а вот вторая может случайно заставить спулер перечесть статус.

А эксплорер-то что про принтер показывает? Тоже Ready, пока не пошлешь на печать? А F5 помогает?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Kak proverit status printera
От: Hobbit  
Дата: 13.08.02 19:13
Оценка:
Здравствуйте Sinclair, Вы писали:


S>Хм. Честно говоря, я этот код за полчаса чтения MSDN накропал — у меня он выдает 0 по всем статусам для ремотного принтера. Хотя тот вроде неисправен. Но его и експлорер показывает как Ready.


S>В общем, я вижу два варианта:

S>1. Это косяк винды, и он непреодолим в рамках Win32
S>2. попробовать порыть в сторону FlushPrinter и ResetPrinter, начав со второй. Первую я вообще-то не понял, т.к. неясно, что за данные надо запихивать в принтер, а вот вторая может случайно заставить спулер перечесть статус.

S>А эксплорер-то что про принтер показывает? Тоже Ready, пока не пошлешь на печать? А F5 помогает?




Ia vse bolshe skloniaus k misli chto eto variant 1-no chert ego znaet.

ResetPrinter nado poprobovat! Spasibo za ideu.

Explorer pokazivaet "ready" i f5 ne pomogaet..U menia printer seichas otkluchen voobshe...i vot on "ready"
Re[5]: Kak proverit status printera
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.08.02 20:07
Оценка:
Здравствуйте Hobbit, Вы писали:
[skipped/]
H>Explorer pokazivaet "ready" i f5 ne pomogaet..U menia printer seichas otkluchen voobshe...i vot on "ready"
На вопрос "готов ли самовар?" он печально ответил: "Готов..."
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Kak proverit status printera
От: Hobbit  
Дата: 13.08.02 20:10
Оценка:
Здравствуйте Sinclair, Вы писали:

S>Здравствуйте Hobbit, Вы писали:

S>[skipped/]
H>>Explorer pokazivaet "ready" i f5 ne pomogaet..U menia printer seichas otkluchen voobshe...i vot on "ready"
S>На вопрос "готов ли самовар?" он печально ответил: "Готов..."


A otkuda eta zitata ?

No v obshem imenno tak...
Re[4]: Kak proverit status printera
От: Юнусов Булат Россия  
Дата: 13.08.02 21:25
Оценка:
Здравствуйте Sinclair, Вы писали:

В самом деле странно, вот wtl-ный вариант который (по винапишным вызовам) делает абсолютно тоже самое что и твой.
    CPrinter printer;
    printer.OpenDefaultPrinter();
    CPrinterInfo<2> printer_info((HANDLE)printer);
    ATLTRACE("\n%d, %s", printer_info.m_pi->Status, printer_info.m_pi->pPrinterName);


И с тем же результатом.
Я и бумагу вынимал и дверцу открывал и во время печати этот код вызывал, а статус все равно в нуле — прям засада какая то.
Re[5]: Kak proverit status printera
От: Hobbit  
Дата: 13.08.02 21:47
Оценка: 21 (1)
Здравствуйте Юнусов Булат, Вы писали:

i Sinclair

Mne dali rebiata vot takoi link:

http://support.microsoft.com/default.aspx?scid=KB;EN-US;q160129&amp;


tam v samom nachale napisano chto printer mojno proverit tolko kogda posilaesh job...

No ia polagal chto kto-to na forume mojet znat kak eto vse oboiti.
Re[6]: Kak proverit status printera
От: Юнусов Булат Россия  
Дата: 14.08.02 03:16
Оценка:
Здравствуйте Hobbit, Вы писали:
H>tam v samom nachale napisano chto printer mojno proverit tolko kogda posilaesh job...

Ай шайтан, не знал, точно — засада.
Re[6]: Kak proverit status printera
От: iLYA Канада http://www.bizon.org/ilya/
Дата: 14.08.02 04:08
Оценка:
Здравствуйте Hobbit, Вы писали:

H>Здравствуйте Юнусов Булат, Вы писали:


H>i Sinclair


H>Mne dali rebiata vot takoi link:


H>http://support.microsoft.com/default.aspx?scid=KB;EN-US;q160129&amp;



H>tam v samom nachale napisano chto printer mojno proverit tolko kogda posilaesh job...


H>No ia polagal chto kto-to na forume mojet znat kak eto vse oboiti.



Так что, уберите 0 с моего постинга
Автор: iLYA
Дата: 13.08.02

Шутка. :))
Раз партия сказала — значит надо!!!

Можете ткнутся сюда и посмотреть чего я делал со всякими GetJob-ами

iLYA
Re: Kak proverit status printera
От: Patalog Россия  
Дата: 14.08.02 10:28
Оценка:
Здравствуйте Hobbit, Вы писали:

H>Privet,

H>Podskajite pojaluista kak mojno proverit status printera v NT (2000,XP) vrode "out of paper", "offline" i tak dalee, ne posilaia stranichku v print.
H>Pasiba:)

Ежели у тебя получиться выполнить функцию ReadPrinter, то можно сделать так:
1. OpenPrinter
2. WritePrinter с pBuf =
<ESC>%-12345X@PJL <CR><LF>
@PJL INFO STATUS [<CR>]<LF>
<ESC>%-12345X

3. ReadPrinter

В буфере должно быть что-то типа:
@PJL USTATUS DEVICE
CODE=10006
DISPLAY="16 TONER LOW"
ONLINE=TRUE


Основную ценность представляет поле CODE. Ежели ты его получишь, отпиши, пришлю описание кодов.

ЗЫж Я, кстати вышеописанный алгоритм воспроизвести так и не сумел, ибо ReadPrinter упорно возвращает ошибку 0x00000006 — The handle is invalid.
Танцы с бубном вокруг biderectional и иже с ним не помогли. Также не помогло dwMode = DI_CHANNEL в DOC_INFO_2 (для w98).
Проверял я это на сетевых и USB принтерах. Так что если у тебя принтер на LPT, попробуй.
Почетный кавалер ордена Совка.
Re[7]: Kak proverit status printera
От: Hobbit  
Дата: 14.08.02 12:50
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Здравствуйте Hobbit, Вы писали:

H>>tam v samom nachale napisano chto printer mojno proverit tolko kogda posilaesh job...

ЮБ>Ай шайтан, не знал, точно — засада.



Da sploshnoi Iblis a tak je jinni Ia znau chto narod kak-to delal...no kak?! Eto-to vopros veka
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.