Здравствуйте Patalog, Вы писали:
S>>Здравствуйте!
S>>как можно определить кол-во страниц в отправляемом на принтер задании?
S>>можно ли получить/изменить значения поля спулера "Pages"?
S>>заранее спасибо.
P>Получить можно. Посмотри на GetJob (EnumJobs). Насчет изменить — х3. ИМХО весьма проблематично, напрашивается вариант с перехватом функций, но... Оно тебе надо?
да я смотрел. даже функцию, отсюда использовать пробовал
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q158828
в консольном приложении все работает замечательно.
но как только я пытаюсь определить кол-во страниц в своем порт-мониторе, она возвращает неверное кол-во страниц.
или я где-то туплю, или что-то глючит
по поводу изменить значение.
----------------------------
мне нужно отображать действительное состояние процесса печати задания.
т.е. если напечатано две страницы из четырех, то спулер должен в поле pages отобразить "2/4".
или второй вариант отображать только общее кол-во страниц в задании ("4").
Any idea?
Здравствуйте storm, Вы писали:
[]
S>по поводу изменить значение.
S>----------------------------
S>мне нужно отображать действительное состояние процесса печати задания.
S>т.е. если напечатано две страницы из четырех, то спулер должен в поле pages отобразить "2/4".
S>или второй вариант отображать только общее кол-во страниц в задании ("4").
S>Any idea?
А tyt собст. идей никаких и нет... Сколько страниц напечаталось точно, знает только сам принтер и юзер, который смотрит за процессом

.
Все что можно поиметь, это сколько страниц ушло принтеру, а сколько он напечетал... Можно конечно спросить у самого принтера, я уже хде-то писал про это. Ежели ты добрался до порт монитора, тогда уж заодно и Language Monitor заюзай, он как раз для biderectional...
А насчет порт монитора — в чем проблема? Показывай код, посмотрим...
Здравствуйте Patalog, Вы писали:
S>>по поводу изменить значение.
S>>----------------------------
S>>мне нужно отображать действительное состояние процесса печати задания.
S>>т.е. если напечатано две страницы из четырех, то спулер должен в поле pages отобразить "2/4".
S>>или второй вариант отображать только общее кол-во страниц в задании ("4").
P>А tyt собст. идей никаких и нет... Сколько страниц напечаталось точно, знает только сам принтер и юзер, который смотрит за процессом
.
P>Все что можно поиметь, это сколько страниц ушло принтеру, а сколько он напечетал... Можно конечно спросить у самого принтера, я уже хде-то писал про это. Ежели ты добрался до порт монитора, тогда уж заодно и Language Monitor заюзай, он как раз для biderectional...
у меня в порт мониторе запускается нить, которая читает данные, приходящие от принтера — так я могу отслеживать кол-во напечатанных страниц (@PJL USTATUS PAGE=ON в начале задания).
P>А насчет порт монитора — в чем проблема? Показывай код, посмотрим...
вот фунцкция, выдранная из KB, которую я юзаю для определения кол-ва страниц в задании. вызываю в StartDoc,
WritePort, EndDocPort. результат одинаковый — возвращает неправильное кол-во (как правило 1).
эта же ф-я в консольном приложении работает правильно

причем одновременно в консольном приложении и порт-мониторе результат разный
бред какой-то
BOOL ListJobsForPrinter( LPTSTR szPrinterName )
{
HANDLE hPrinter;
DWORD dwNeeded, dwReturned, i;
JOB_INFO_1 *pJobInfo;
// You need a printer handle, open the printer
if( ! OpenPrinter( szPrinterName, &hPrinter, NULL ) )
return FALSE;
// First you call EnumJobs() to find out how much memory you need
if( ! EnumJobs( hPrinter, 0, 0xFFFFFFFF, 1, NULL, 0, &dwNeeded,
&dwReturned ) )
{
// It should have failed, but if it failed for any reason other
// than "not enough memory", you should bail out
if( GetLastError() != ERROR_INSUFFICIENT_BUFFER )
{
ClosePrinter( hPrinter );
return FALSE;
}
}
// Allocate enough memory for the JOB_INFO_1 structures plus
// the extra data - dwNeeded from the previous call tells you
// the total size needed
if( (pJobInfo = (JOB_INFO_1 *)malloc( dwNeeded )) == NULL )
{
ClosePrinter( hPrinter );
return FALSE;
}
// Call EnumJobs() again and let it fill out our structures
if( ! EnumJobs( hPrinter, 0, 0xFFFFFFFF, 1, (LPBYTE)pJobInfo,
dwNeeded, &dwNeeded, &dwReturned ) )
{
ClosePrinter( hPrinter );
free( pJobInfo );
return FALSE;
}
// You're done with the printer handle, close it
ClosePrinter( hPrinter );
// dwReturned tells how many jobs there are
// Here, you'll simply display the number of jobs found
printf( "%d jobs\n", dwReturned );
// It's easy to loop through the jobs and access each one
for(i=0;i<dwReturned;i++)
{
// pJobInfo[i] is a JOB_INFO_1 struct for that job
// so here you could do whatever you want for each job
mysyslog( "[%d] [%s] TotalPages[%u] PagesPrinted[%u]\n", pJobInfo[i].JobId,
pJobInfo[i].pDocument,
pJobInfo[i].TotalPages,
pJobInfo[i].PagesPrinted
);
}
// Clean up
free( pJobInfo );
return TRUE;
}