Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

учет количества напечатанных страниц принтером

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> учет количества напечатанных страниц принтером
Имя
Сообщение << Старые топики   Новые топики >>
учет количества напечатанных страниц принтером - 2010-06-24 01:10:58.510000   
MuLLIKA

Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
Доброго времени суток! Такой вопрос - одноранговая сеть, на одном из компьютеров стоит принтер которым пользуются все члены сети. Писал программу по учету количества страниц используя EnumJobs, кароче работал с очередью печати. Проблема в том, что когда печать идет с локальной машины сообщения (spooling, printing и т.д.) приходят стабильно, т.е. по этим сообщениям информация о пользователе, имени машины, кол-ве страниц я могу записать без проблем, но когда печать идет по сети эти сообщения приходят не стабильно, т.е. допустим "статус" = printing может прийти, а может и не прийти.
Может, кто подскажет что то интересное, зарание спасибо!)
Post #: 1
RE: учет количества напечатанных страниц принтером - 2010-06-24 04:50:05.713333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Лучше запрашивать количество напечатанных страниц непосредственно у принтера. В большинстве моделей такой счётчик присутствует.
Post #: 2
RE: учет количества напечатанных страниц принтером - 2010-06-24 10:02:05.916666   
MuLLIKA

Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
quote:

Лучше запрашивать количество напечатанных страниц непосредственно у принтера. В большинстве моделей такой счётчик присутствует.

А как это реализовать? с помощью каких функций?
Post #: 3
RE: учет количества напечатанных страниц принтером - 2010-06-24 15:00:23.266666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Это уже документацию по принтерам надо читать =). Только не пользовательскую, а программерскую.
Post #: 4
RE: учет количества напечатанных страниц принтером - 2010-06-24 16:52:11.256666   
MuLLIKA

Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
quote:

Это уже документацию по принтерам надо читать =). Только не пользовательскую, а программерскую

а не подскажешь где ее можно найти?
Post #: 5
RE: учет количества напечатанных страниц принтером - 2010-06-24 16:56:08.216666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
В интернете или у производителя.
Post #: 6
RE: учет количества напечатанных страниц принтером - 2010-06-24 21:03:55.983333   
MuLLIKA

Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
quote:

В интернете или у производителя.


посмотри вот это http://programmer.newmail.ru/programs/LPT/esc.txt - это похоже на правду?)
Аппаратное обеспечение персонального компьютера А.В.Фролов - нашел такую книгу, только скачать не где(
Post #: 7
RE: учет количества напечатанных страниц принтером - 2010-06-25 23:10:05.260000   
MuLLIKA

Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
Еще вопрос может кто подскажет, при печати вордовского файла и excel файлов по сети, на машине где стоит принтер сохраняется распечатываемый документ в его изначальном формате? Или есть способы достать распечатываемй документ с машины которая печатает? собрать из пакетов которые пришли по сети, либо как то утянуть с той машины?
Зарание спасибо!
Post #: 8
RE: учет количества напечатанных страниц принтером - 2010-06-26 14:19:15.850000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ты даже не определишь, из какого приложения отправили задание на печать, и что именно печатают.
Post #: 9
RE: учет количества напечатанных страниц принтером - 2010-06-26 16:48:06.110000   
MuLLIKA

Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
Смотри, есть принтер - он расшарен (т.е. не принт сервер со своим ип, физически подключен к компу), все компы соеденены в одноранговую сеть, если я печатаю с соседнего компьютера на котором нет принтера, то изменения в очереди печати будут происходить на той машине где я печатаю или на той к которой принтер подключен физически? Если есть коды по перехвату очереди печати, скиньте пожалйуста!
Post #: 10
RE: учет количества напечатанных страниц принтером - 2010-06-26 20:35:40.083333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Мне лень за тебя искать в МСДН :)
Post #: 11
RE: учет количества напечатанных страниц принтером - 2010-06-27 21:58:29.323333   
MuLLIKA

Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
Я писал код:

#define _WIN32_WINNT 0x0501 //без нее не будет работать GetDefaultPrinter

#include <stdio.h>
#include <Wingdi.h>
#include <winspool.h>
#include <windows.h>
#include <tchar.h>
#include <windef.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <process.h>
#include <time.h>

#include "resource.h"

HANDLE hPrinter, chgObject; //handle открытия принтера, поиска изменения в очереди печати
PRINTER_DEFAULTS *pStruct;
DWORD m_NonberJob, dwWait;
BOOL bFlag, nFlag;
FILE *stream;
JOB_INFO_2 *pInfoPrinter; // структура хранящая информацию по задаче отправленную на печать
PRINTER_NOTIFY_INFO *prnNotifyInfo = NULL;
char *bufNameComp;
int TotalP = 1, CopyP = 1;

int funcExitInProgram();

void funcWriteFile(LPSTR NameMach, LPSTR NameUser, LPSTR NameDoc, DWORD TotP, short copies, int SumPag) { // функция записи в файл информации по задаче
FILE *stream = fopen("log.txt", "a++");
if(stream == NULL) {
MessageBox(NULL, "Не возможно создать файл!", "Ошибка", MB_OK);
funcExitInProgram();
exit(1);
}
SYSTEMTIME *LOCALTIME = (SYSTEMTIME *) malloc (sizeof(SYSTEMTIME)); //переменная времени
GetLocalTime(LOCALTIME); // функция получения локального времени
fprintf(stream, "========================== Дата %d.%d.%d - %d:%d:%d ===========================\n", LOCALTIME->wDay, LOCALTIME->wMonth,
LOCALTIME->wYear, LOCALTIME->wHour, LOCALTIME->wMinute, LOCALTIME->wSecond);
fprintf(stream, "Имя компьютера = %s\n", NameMach);
fprintf(stream, "Имя пользователя = %s\n", NameUser);
fprintf(stream, "Документ = %s\n", NameDoc);
fprintf(stream, "Количество страниц = %d\n", TotP);
fprintf(stream, "Количество копий документа = %d\n", copies);
fprintf(stream, "Общее количество страниц = %d\n", SumPag);
fprintf(stream, "Printer Sniffer v. 1.0 developed by Shabalin Ivan (VAS, group number 4275) (C)\n");
fprintf(stream, "==============================================================================\n\n");
fclose(stream); // файл закрывается
free(LOCALTIME); // освобождается память переменной времени
TotalP = 1;
CopyP = 1;
}

int workWithPrinter(HANDLE hPrinter, char *NameComp) {
char *buffer = (char *)malloc(4);
DWORD size = 8000, byteNeed = 8000;
DWORD num = 0, pdw = 0;
int sum = 0;
GetDefaultPrinter(NULL, &num);
if(!GetDefaultPrinter(buffer, &num)) { //находим имя принтера
free(buffer);
MessageBox(NULL, "GetDefaultPrinter! - принтер не найден!", "Ошибка", MB_OK);
return -1;
}
bFlag = OpenPrinter(buffer, &hPrinter, pStruct); // функция открытия принтера
if(!bFlag){
MessageBox(NULL, "Программа не может получить доступ к принтеру!", "Ошибка", MB_OK);
funcExitInProgram();
return -1;
}
free(buffer);
chgObject = FindFirstPrinterChangeNotification(hPrinter, PRINTER_CHANGE_WRITE_JOB, 0, NULL); //функйия задающая получение любых изменений в очереди печати
if (!chgObject) {
MessageBox(NULL, "FindFirstPrinterChangeNotification!", "Ошибка", MB_OK);
funcExitInProgram();
return -1;
}
dwWait = WaitForSingleObject(chgObject, INFINITE); // функция ждет изменения в очереди печати
if(dwWait == WAIT_FAILED) {
MessageBox(NULL, "WaitForSingleObject!", "Ошибка", MB_OK);
funcExitInProgram();
return -1;
}
pInfoPrinter = (JOB_INFO_2 *)malloc(8000);
if(EnumJobs(hPrinter, 0, 8000, 2, (LPBYTE)pInfoPrinter, size, &byteNeed, &m_NonberJob) != 0) {
printf("Status = %d\n", pInfoPrinter->Status);
printf("id = %d\n", pInfoPrinter->JobId);
printf("pStatus = %s\n", pInfoPrinter->pDocument);
printf("Nomber = %d\n", m_NonberJob);
printf("Position = %d\n", pInfoPrinter->Position);
printf("Size= %d\n", pInfoPrinter->Size);
printf("Total P = %d\n", pInfoPrinter->TotalPages);
printf("===========================================\n");
if(memcmp(pInfoPrinter->pMachineName, NameComp, strlen(pInfoPrinter->pMachineName)) == 0) { //локальная машина печатает
printf("local comp\n");
if((pInfoPrinter->Status == 16) && (pInfoPrinter->Size == 0)) {
if(pInfoPrinter->TotalPages > 1) {
if(pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies > 1) {
pInfoPrinter->TotalPages = pInfoPrinter->TotalPages / pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies;
}
}
sum = pInfoPrinter->TotalPages * pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies;
funcWriteFile(pInfoPrinter->pMachineName, pInfoPrinter->pUserName, pInfoPrinter->pDocument,
pInfoPrinter->TotalPages, pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies, sum);
}
}
else { //печать по сети
int ch = 'Microsoft Word';
char *pos = NULL;
char *doc = (char *)pInfoPrinter->pDocument;
pos = (char *)memchr(doc, ch, strlen((pInfoPrinter->pDocument)));
if(pos == NULL) { // excel файл
printf("excel\n");
if((pInfoPrinter->Status == 8) && (pInfoPrinter->Size < 30000) && (pInfoPrinter->TotalPages == 1)){
sum = pInfoPrinter->TotalPages * pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies;
funcWriteFile(pInfoPrinter->pMachineName, pInfoPrinter->pUserName, pInfoPrinter->pDocument,
pInfoPrinter->TotalPages, pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies, sum);
}
if(pInfoPrinter->TotalPages > TotalP) TotalP = pInfoPrinter->TotalPages;
if(pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies > CopyP) CopyP = pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies;
if(pInfoPrinter->Size == 0) {
sum = TotalP * CopyP;
funcWriteFile(pInfoPrinter->pMachineName, pInfoPrinter->pUserName, pInfoPrinter->pDocument,
TotalP, CopyP, sum);
}
}
else { //файл word
printf("word file\n");
if((pInfoPrinter->Status == 8) && (pInfoPrinter->Size < 30000) && (pInfoPrinter->TotalPages == 1)){
sum = pInfoPrinter->TotalPages * pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies;
funcWriteFile(pInfoPrinter->pMachineName, pInfoPrinter->pUserName, pInfoPrinter->pDocument,
pInfoPrinter->TotalPages, pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies, sum);
}
if(pInfoPrinter->TotalPages > TotalP) TotalP = pInfoPrinter->TotalPages;
if(pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies > CopyP) CopyP = pInfoPrinter->pDevMode->UNIONNAME.STRUCTNAME.dmCopies;
if(pInfoPrinter->Size == 0) {
sum = TotalP * CopyP;
funcWriteFile(pInfoPrinter->pMachineName, pInfoPrinter->pUserName, pInfoPrinter->pDocument,
TotalP, CopyP, sum);
}
}

}

} else {
MessageBox(NULL, "EnumJobs - выполнена с ошибкой!", "Ошибка", MB_OK);
printf("Enum error %d\n", GetLastError());
funcExitInProgram();
return -1;
}
FindNextPrinterChangeNotification(chgObject, &pdw, NULL, (LPVOID *)&pInfoPrinter);
free(pInfoPrinter);
FindClosePrinterChangeNotification(chgObject); //закрыть данное изменение в очереди печати
ClosePrinter(hPrinter);
return 1;
}

int funcExitInProgram() {
ClosePrinter(hPrinter); //закрываем handle принтера
return 1;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
bufNameComp = (char *) malloc(MAX_COMPUTERNAME_LENGTH + 1);
unsigned long s = MAX_COMPUTERNAME_LENGTH + 1;
GetComputerName(bufNameComp, &s); //узнаем имя локальной машины
char *ch = (char *) malloc (300);
sprintf(ch, "\\\\%s\0", bufNameComp); // \\имя машины
while(workWithPrinter(hPrinter, ch) == 1) //функция выполнения задачи
funcExitInProgram();
free(bufNameComp);
free(ch);
return 1;
}


проблема в том, что он пр печати с локальной машины стабильно принимает изменение очереди печати, а при печати с "соседней" машины сообщения об изменении приходят не стабильно, и количество страниц указывается не верно
Post #: 12
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> учет количества напечатанных страниц принтером







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.