Здравствуйте 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;
}