учет количества напечатанных страниц принтером
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
учет количества напечатанных страниц принтером - 2010-06-24 01:10:58.510000
|
|
|
MuLLIKA
Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
|
Доброго времени суток! Такой вопрос - одноранговая сеть, на одном из компьютеров стоит принтер которым пользуются все члены сети. Писал программу по учету количества страниц используя EnumJobs, кароче работал с очередью печати. Проблема в том, что когда печать идет с локальной машины сообщения (spooling, printing и т.д.) приходят стабильно, т.е. по этим сообщениям информация о пользователе, имени машины, кол-ве страниц я могу записать без проблем, но когда печать идет по сети эти сообщения приходят не стабильно, т.е. допустим "статус" = printing может прийти, а может и не прийти. Может, кто подскажет что то интересное, зарание спасибо!)
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-24 04:50:05.713333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Лучше запрашивать количество напечатанных страниц непосредственно у принтера. В большинстве моделей такой счётчик присутствует.
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-24 10:02:05.916666
|
|
|
MuLLIKA
Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
|
quote:
Лучше запрашивать количество напечатанных страниц непосредственно у принтера. В большинстве моделей такой счётчик присутствует. А как это реализовать? с помощью каких функций?
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-24 15:00:23.266666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Это уже документацию по принтерам надо читать =). Только не пользовательскую, а программерскую.
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-24 16:52:11.256666
|
|
|
MuLLIKA
Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
|
quote:
Это уже документацию по принтерам надо читать =). Только не пользовательскую, а программерскую а не подскажешь где ее можно найти?
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-24 16:56:08.216666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
В интернете или у производителя.
|
|
|
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 - это похоже на правду?) Аппаратное обеспечение персонального компьютера А.В.Фролов - нашел такую книгу, только скачать не где(
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-25 23:10:05.260000
|
|
|
MuLLIKA
Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
|
Еще вопрос может кто подскажет, при печати вордовского файла и excel файлов по сети, на машине где стоит принтер сохраняется распечатываемый документ в его изначальном формате? Или есть способы достать распечатываемй документ с машины которая печатает? собрать из пакетов которые пришли по сети, либо как то утянуть с той машины? Зарание спасибо!
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-26 14:19:15.850000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Ты даже не определишь, из какого приложения отправили задание на печать, и что именно печатают.
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-26 16:48:06.110000
|
|
|
MuLLIKA
Сообщений: 36
Оценки: 0
Присоединился: 2010-06-24 00:59:34.416666
|
Смотри, есть принтер - он расшарен (т.е. не принт сервер со своим ип, физически подключен к компу), все компы соеденены в одноранговую сеть, если я печатаю с соседнего компьютера на котором нет принтера, то изменения в очереди печати будут происходить на той машине где я печатаю или на той к которой принтер подключен физически? Если есть коды по перехвату очереди печати, скиньте пожалйуста!
|
|
|
RE: учет количества напечатанных страниц принтером - 2010-06-26 20:35:40.083333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Мне лень за тебя искать в МСДН :)
|
|
|
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; } проблема в том, что он пр печати с локальной машины стабильно принимает изменение очереди печати, а при печати с "соседней" машины сообщения об изменении приходят не стабильно, и количество страниц указывается не верно
|
|
|
|
|