Определение количества страниц в печатаемом задании
От: storm  
Дата: 14.10.02 16:34
Оценка:
Здравствуйте!
как можно определить кол-во страниц в отправляемом на принтер задании?
можно ли получить/изменить значения поля спулера "Pages"?
заранее спасибо.
Re: Определение количества страниц в печатаемом задании
От: Patalog Россия  
Дата: 14.10.02 17:47
Оценка:
Здравствуйте storm, Вы писали:

S>Здравствуйте!

S>как можно определить кол-во страниц в отправляемом на принтер задании?
S>можно ли получить/изменить значения поля спулера "Pages"?
S>заранее спасибо.

Получить можно. Посмотри на GetJob (EnumJobs). Насчет изменить — х3. ИМХО весьма проблематично, напрашивается вариант с перехватом функций, но... Оно тебе надо?
Почетный кавалер ордена Совка.
Re[2]: Определение количества страниц в печатаемом задании
От: storm  
Дата: 14.10.02 20:09
Оценка:
Здравствуйте 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?
Re[3]: Определение количества страниц в печатаемом задании
От: Patalog Россия  
Дата: 14.10.02 20:39
Оценка:
Здравствуйте storm, Вы писали:

[]

S>по поводу изменить значение.

S>----------------------------
S>мне нужно отображать действительное состояние процесса печати задания.
S>т.е. если напечатано две страницы из четырех, то спулер должен в поле pages отобразить "2/4".
S>или второй вариант отображать только общее кол-во страниц в задании ("4").

S>Any idea?


А tyt собст. идей никаких и нет... Сколько страниц напечаталось точно, знает только сам принтер и юзер, который смотрит за процессом .
Все что можно поиметь, это сколько страниц ушло принтеру, а сколько он напечетал... Можно конечно спросить у самого принтера, я уже хде-то писал про это. Ежели ты добрался до порт монитора, тогда уж заодно и Language Monitor заюзай, он как раз для biderectional...

А насчет порт монитора — в чем проблема? Показывай код, посмотрим...
Почетный кавалер ордена Совка.
Re[4]: Определение количества страниц в печатаемом задании
От: storm  
Дата: 15.10.02 05:37
Оценка:
Здравствуйте 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;
 }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.