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
Здравствуйте 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
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.
Здравствуйте 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);
};
// };
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
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, Вы писали:
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 помогает?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
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"
Здравствуйте Hobbit, Вы писали:
[skipped/] H>Explorer pokazivaet "ready" i f5 ne pomogaet..U menia printer seichas otkluchen voobshe...i vot on "ready"
На вопрос "готов ли самовар?" он печально ответил: "Готов..."
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте Sinclair, Вы писали:
S>Здравствуйте Hobbit, Вы писали: S>[skipped/] H>>Explorer pokazivaet "ready" i f5 ne pomogaet..U menia printer seichas otkluchen voobshe...i vot on "ready" S>На вопрос "готов ли самовар?" он печально ответил: "Готов..."
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.
Здравствуйте 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
Основную ценность представляет поле CODE. Ежели ты его получишь, отпиши, пришлю описание кодов.
ЗЫж Я, кстати вышеописанный алгоритм воспроизвести так и не сумел, ибо ReadPrinter упорно возвращает ошибку 0x00000006 — The handle is invalid.
Танцы с бубном вокруг biderectional и иже с ним не помогли. Также не помогло dwMode = DI_CHANNEL в DOC_INFO_2 (для w98).
Проверял я это на сетевых и USB принтерах. Так что если у тебя принтер на LPT, попробуй.
Здравствуйте Юнусов Булат, Вы писали:
ЮБ>Здравствуйте 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