МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЕОМ
/
КУРСОВИЙ ПРОЕКТ
з дисципліни:
«Системне програмне забезпечення»
на тему:
«РОЗРОБКА СИСТЕМНОЇ УТИЛІТИ - СТАТИСТИКА ДРУКУ»
ЗАВДАННЯ
Розробити системну утиліту статистики друк, тобто яка б перехоплювала повідомлення зміни принтера і записувала дані про друк у визначеному місці. Дана системна утиліта повинна виконувати такі операції:
запуск моніторингу друку;
зупинка моніторингу друку;
підрахування загальної кількості сторінок;
перейменування файлу.
Перелік необхідної інформації друку, яка буде вестись в статистиці:
назва комп’ютера;
назва користувача;
назва принтера;
кількість сторінок;
назва документа.
АНОТАЦІЯ
В даному курсовому проекті було розроблено утиліту моніторингу принтерів, яка записує в окремий файл (print.log) повідомлення від черги друку.
Було зроблено простий та зручний дизайн, який дає змогу користуватись даною утилітою і простому користувачеві. В програмі було розроблено і 3 додаткові функції, які дозволяють більш краще використовувати дану утиліту, а саме функція підрахунку кількості надрукованих сторінок, заміна файлу (збереження файлу під іншим іменем, яке містить дату заміни), а також відкривання файлу print.log.
ЗМІСТ
ВСТУП 5
1. ОГЛЯД СЛУЖБИ ДРУКУ ТА ПРОГРАМ ВЕДЕННЯ СТАТИСТИКИ ДРУКУ 6
1.1. Служба друку 6
1.1.1. Служба друку в ОС Windows 9
1.2. Огляд і порівняльний аналіз існуючих утиліт для ведення статистики друку 10
1.2.1. Огляд основних можливостей програми Printer Usage Censor 11
1.2.2. Огляд основних можливостей програми Printer Activity Monitor 12
1.2.3. Огляд основних можливостей програми O&K Print Watch 13
1.3. Системні виклики для роботи з чергою друку, файлами, потоками 15
1.3.1. Перелік необхідних бібліотек в С++ для реалізації поставленого завдання. 15
1.3.2. Перелік API функцій для вирішення поставленої задачі. 16
2. АНАЛІЗ ЗАВДАННЯ РОЗРОБКИ СИСТЕМНОЇ УТИЛІТИ СТАТИСТИКИ ДРУКУ ТА СПОСІБ ЙОГО ВИРІШЕННЯ 21
2.1. Аналіз завдання 21
2.2. Способи вирішення завдання 22
3. РОЗРОБКА СИСТЕМНОЇ УТИЛІТИ СТАТИСТИКИ ДРУКУ 25
3.1. Вибір технології програмування 25
3.2. Розробка системної утиліти статистики друку 26
3.3. Список розроблених функцій 36
4. ІНТЕРФЕЙС ТА ТЕСТУВАННЯ СИСТЕМНОЇ УТИЛІТИ СТАТИСТИКИ ДРУКУ 38
4.1. Інтерфейс системної утиліти статистики друку 38
4.2. Тестування системної утиліти 39
ВИСНОВОК 43
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 44
ДОДАТОК А 45
ВСТУП
Персональний комп'ютер являє собою цілком самостійний пристрій, у якому є все необхідне для автономного існування. Однак діяльність комп'ютера була б неповноцінною без такого простого на перший погляд пристрою, як принтер. Принтер необхідний для виготовлення паперових копій документів, підготовлених на комп'ютері. Зараз принтер можна побачити в кожному офісі, у багатьох домашніх користувачів є струменевий принтер для друку фотографій і листівок, у касах і банках на матричних принтерах друкуються квитки, документи тощо.
Актуальність моєї теми курсового проекту полягає в наступному:
часто у власників принтерів виникає необхідність у визначенні кількості роздрукованих сторінок за одну заправку картриджа;
директорів може цікавити кількість сторінок, дати і час, а також назви файлів, які посилають на друк його робітники;
у системних адміністраторів може виникнути необхідність у більш рівномірному розподілі друкуючих ресурсів між користувачами.
У даному курсовому проекті буде розроблено системну утиліту статистики друку, яка буде розрахована для роботи в ОС Microsoft Windows для ведення статистики друку. Буде реалізовано простий інтерфейс, що зробить дану системну утиліту доступною в користуванні простим користувачам ПК.
1. ОГЛЯД СЛУЖБИ ДРУКУ ТА ПРОГРАМ ВЕДЕННЯ СТАТИСТИКИ ДРУКУ
Коли ви щось друкуєте, документи надходять до черги друку (див. рис.1.1). Черга друку відображає, які документи друкуються зараз і які очікують на друк. Окрім того, тут надається корисна інформація: стан друку, користувач, який друкує, документ, який друкується, а також кількість сторінок.
/
Рис.1.1. Черга друку
У цьому розділі подано інформацію про службу друку та службу друку в ОС Windows, це є необхідною інформацією для написання системної утиліти «Статистика принтерів», розглянуто деякі найпопулярніші уже існуючі утиліти для ведення статистики друку та здійснено їх порівняльний аналіз. Оскільки у курсовому проекті не тільки здійснюється огляд, а й розробляється утиліта ведення статистики друку, то також подано інформацію про засоби, за допомогою яких вона буде розроблена.
1.1. Служба друку
Служба друку - це набір утиліт, за допомогою яких системний адміністратор (або адміністратор друку) налаштовує, відстежує і керує мережними принтерами.
Служба друку виконує наступні функції:
отримує файли, що відправляються користувачами на друк;
за необхідності проводить фільтрацію файлів для забезпечення друку;
планує роботу одного або кількох принтерів;
запускає інтерфейсну програму принтера;
здійснює моніторинг стану завдань;
повідомляє про неполадки принтера;
створює повідомлення про помилки.
При отриманні відправленого користувачем файлу, служба друку привласнює запиту (завданню друку) унікальне ім'я - ID запиту.
ID запиту складається з імені принтера і унікального номера, що ідентифікує файл. За допомогою ID запиту здійснюється перегляд стану завдання друку і відміна завдання. Служба друку зберігає всі запити на друк в протоколі запитів.
Завдання друку буферизується разом з іншими завданнями друку, що відправлені до принтеру. Всі завдання друку виконуються по черзі. Набір завдань, що чекають на друк називається чергою друку.
Кожному принтеру відповідає своя черга друку. Завдання в черзі можна припиняти, переміщати або переносити в іншу чергу. Всі завдання друку відправляються в програму “демон” буферизації, який створюється при запуску служби друку.
/
Рис.1.2. Процес обробки запиту на друк
“Демон” (daemon) - це процес, що відслідковує надходження запитів на друк файлів і забезпечує скерування завдань на відповідний принтер у потрібний час. Він слідкує за станом принтерів і зберігає облікові відомості про їх використання в протоколі запиту. “Демон” працює в фоновому режимі. “Демон” буферизації також відповідає за моніторинг стану принтерів і фільтрів. При завершенні друку одного завдання, “демон” починає друк наступного за чергою завдання.
Для налаштування служби друку необхідно змінити або замінити деякі з елементів, що показані на рис.1.2.
Налаштування служби друку. В більшості випадків необхідно просто змінити конфігурацію принтера, що зберігається на диску. Додаткову інформацію про додавання або зміну локального принтера можна дізнатися за допомогою команди lpadmin.
База даних terminfo. Якщо існують принтери, що не занесені в базу даних terminfo, то до неї необхідно додати записи, що описують можливості принтера. Служба друку звертається до бази даних terminfo в двох випадках: для порівняння завдань друку і можливостей принтера (перевірки, чи може той чи інший принтер виконати завдання) і для налаштування принтера на виконання запитів.
Наприклад, якщо в базі даних terminfo вказано, що довжина сторінки, яка задана користувачем, не підтримується даним принтером, “демон” буферизації анулює запит. Якщо ж інформація з бази даних підтверджує можливість друку з вказаними параметрами, то вони будуть використані інтерфейсною програмою при ініціалізації принтера.
Стандартна інтерфейсна програма. Якщо принтер має складний набір функцій або якщо користувач хоче використати властивості, які не підтримуються службою друку, існує можливість змінити інтерфейсну програму. Інтерфейсна програма здійснює керування принтером:
ініціалізує принтер;
друкує банери;
запускає фільтри, що відправляють копії користувацьких файлів на принтер.
Додаткові фільтри. Повільні і швидкі фільтри забезпечують зв'язок між застосуваннями і принтерами, які використовуються в системі. Фільтри здійснюють перетворення файлів в інші форми (наприклад, перетворення одного набору esc-послідовностей в іншій) і спеціальні налаштування відповідно до запитаних користувачем режимів друку. Повільні фільтри запускаються “демоном” буферизації, не уповільнюючи роботу принтера. Швидкі фільтри запускаються таким чином, що вивід прямує безпосередньо на принтер, тому, вони можуть впливати на керування принтером.
1.1.1. Служба друку в ОС Windows
В операційній системі Windows друкування документів здійснюється прикладними програмами, що ініціюють завдання друку (print job) – програмний код, який містить опис команд друкування а також дані, що виводяться. Завдання друку опрацьовується диспетчером друку (print spooler). З технічної точки зору диспетчер друку являє собою набір бібліотек динамічного компонування (DLL), що управляють отриманням і розподілом завдань друку. Завдання друку зберігається на диску в файлі буферу черги. Диспетчер друку здійснює процес, що називається зворотною диспетчеризацією (despooling) – зчитування файлу і передачу його фізичному пристрою друку. З точки зору інтерфейсу користувача диспетчер друку являє собою вікно Windows з переліченими в ньому завданнями друку. Зазвичай завдання друкуються в порядку їхнього надходження на принтер. За необхідності користувач може змінити цей порядок. Для цього завдання переміщують методом Drag-and-Drop в потрібну позицію у черзі друку. Також в ОС Windows користувач має змогу відмінити або відкласти друк документів. Вказані дії виконуються у вікні диспетчеру друку, яке викликається на екран послідовністю команд “Пуск -> Панель керування -> Пристрої та принтери -> <Поточний принтер>” або подвійним натисканням лівої клавіші миші на ярлику принтера в системній області панелі задач Windows (ярлик принтера з’являється в системній області після відправлення на друк хоча б одного документу).
1.2. Огляд і порівняльний аналіз існуючих утиліт для ведення статистики друку
На теперішній час існує багато утиліт ведення статистики друку принтерами. Декілька з них:
Printer Control 2.1;
RAS Logger System;
O&K Print Watch;
Printer Usage Censor;
Printer Activity Monitor.
Усі вище приведені утиліти дозволяють отримати статистику друку, тобто назву файлу, назву принтера, ім’я комп’ютера та користувача, кількість сторінок, а також дату та час друку. Printer Activity Monitor і Printer Usage Censor у порівнянні із іншими дозволяють переглянути файли, що були відправлені на друк. O&K Print Watch, Printer Usage Censor і Printer Activity Monitor мають функції для поточного керування процесом друку і встановлення обмежень на друк певним користувачам в мережі, або забороні на друк файлів по назві.
Деякі утиліти статистику друку для зберігання статистики додатково вимагаються встановлення програмного забезпечення для роботи з базами даних.
У кожної з цих системних утиліт є свої плюси і мінуси, наприклад недоліком RAS Logger System є те що він не підтримується в 64-х розрядних ОС, Printer Control 2.1 – не дозволяє отримувати статистики, якщо друк виконується через мережу. Перевагою Printer Activity Monitor над іншими є змога перегляду надрукованих документів, але з іншої сторони дана функція вимагає додаткового простору пам’яті. В наступних підрозділ буде розглянуто детальніше аналоги програм ведення статистики друку.
1.2.1. Огляд основних можливостей програми Printer Usage Censor
Printer Usage Censor – це легка в користуванні програма моніторингу принтерів, створена для ведення статистики використання принтерів з’єднаних через мережу, а також управління ними. В статистиці дана програма зберігає назву комп’ютера і користувача, назву і розмір документу, час і дату друку, кількість сторінок, пріоритет, розмір паперу, колір друку.
Основні функції Printer Usage Censor:
Збереження статистики використання принтерів.
Збереження вмісту документу для перегляду.
Заборону друку принтеру, користувачеві, групі.
Встановлення пріоритетів друку для користувачів і груп.
Автентифікацію завдань друку.
Підтримується віддалене встановлення.
Захист програмних налаштувань.
Багатомовний інтерфейс.
Аналіз використання принтерів
Print Censor не зупинилась на простому аналізі даних принтерів, вона також дозволяє створювати власні черги для груп і окремих користувачів, що зробило Print Censor вишуканим вибором для системних адміністраторів. Також досить зручною функцією є блокування принтеру, при роздруку певної кількості сторінок.
Перегляд завдань друку та черги.
Print Censor дозволяє Вам переглядати контент завдання друку, а також створення власних черг друку на окремі принтери з встановленням пріоритетів і заборон для окремих груп чи користувачів в мережі.
Управління чергами
Управління чергами надане Print Censor Pro дозволяє Вам виконати усі основні операції прямо з Print Censor Pro. Print Censor Pro працює як сервіс, що означає автоматичний запуск при старті ОС, тобто усі завдання друку будуть внесені в статистику.
На рис.1.3 подано скріншот програми Print Censor Pro.
/
Рис.1.3. Скріншот програми Printer Usage Censor
1.2.2. Огляд основних можливостей програми Printer Activity Monitor
Printer Activity Monitor - програмний продукт, призначений для контролю ефективності використання принтерів Вашої організації. З його допомогою ви легко зможете визначити які документи роздруковувалися на кожному принтерів, які Вас цікавлять, хто з користувачів найбільш активно друкує документи, кількість роздрукованих сторінок, з якого комп'ютера був роздрукований документ, бачити образи роздрукованих документів і т.д.
Переваги Printer Activity Monitor:
програма дозволяє централізовано контролювати всі принтери організації;
програма допомагає відловлювати і забороняти спроби використання офісних принтерів в особистих цілях співробітників;
програма працює в автоматичному режимі і не вимагає додаткових зусиль з Вашого боку;
програма гранично проста у використанні і дозволяє почати контролювання принтерів вже через хвилину після установки;
програма дозволяє будувати велику кількість звітів і діаграм, що показують ефективність використання принтерів;
програма має спеціальні засоби для автоматизації процесу створення та відправки звітів про використання принтерів відповідальному персоналу;
програма дозволяє переглядати образи роздрукованих документів;
програм точно визначає кількість роздрукованих сторінок.
Програма складається з трьох компонентів:
Агент - системний сервіс, який постійно знаходиться в пам'яті і збирає інформацію про роздруковані документи. Агент встановлюється або на принт-сервер, або на робочі станції користувачів.
Центр Зберігання Даних (Дата Центр) - системний сервіс, який отримує від агентів інформацію про роздруковані документи і акумулює їх в базу даних.
Консоль Управління - оснастка для Microsoft Management Console, призначена для адміністрування програми та аудиту друку.
На рис.1.4 наведено скріншот даної програми.
/
Рис.1.4. Скріншот програми Printer Activity Monitor
1.2.3. Огляд основних можливостей програми O&K Print Watch
O&K Print Watch (скріншот інтерфейсу програми наведено на рис.1.5) – програма, яка дозволяє оптимізувати процес друку, акуратно і точно виміряти використання принтерів, і спланувати бюджет компанії з урахуванням споживання ресурсів друку кожним користувачем.
Можливості O&K Print Watch – Системи контролю принтера:
відстеження і запис кожного завдання друку на принтері;
збереження роздрукованого документа в PDF форматі або у вигляді зображення;
заборона і призупинення друку документа за вартістю, кольором, кількістю сторінок, ключовими словами;
управління чергою друку;
установка квот і дозволів друку для принтера, користувача, груп користувачів;
контроль витратних матеріалів принтерів та МФУ;
безліч звітів з використання принтерів і обсягами друку;
вбудований веб-сервер для управління принт сервером і перегляду статистики з будь-якого браузера;
підтримка необмеженого числа принтерів і принт-кластерних рішень.
/
Рис.1.5. Скріншот програми O&K Print Watch
1.3. Системні виклики для роботи з чергою друку, файлами, потоками
У курсовому проекті для створення системної утиліти ведення статистики друку необхідно використовувати системні виклики ОС Windows.
Системний виклик — в інформатиці це спосіб використання додатками сервісів ядра операційної системи. Це можуть бути сервіси, пов'язані з апаратною складовою комп'ютера (наприклад, доступ до диска), керування процесами та потоками, та багато іншого. Системні виклики забезпечують інтерфейс між процесом та операційною системою.
Прикладний програмний інтерфейс (англ. Application Programming Interface, API) — набір визначень взаємодії різнотипного програмного забезпечення. API — це зазвичай (але не обов'язково) метод абстракції між низькорівневим та високорівневим програмним забезпеченням.
Для виконання курсового проекту буде зручно використовувати мову програмування С++ разом з функціями API.
1.3.1. Перелік необхідних бібліотек в С++ для реалізації поставленого завдання.
tchar.h – заголовний файл визначеня для загальних функцій міжнародного тексту, призначений для спільних міжнародних функцій, в основному визначає, яка версія кодування char чи wchar_t, або MBCS версія використовується для певної мови. Забезпечує сумісність між однобайтовою, мультибайтовою і Unicode моделями тексту;
set – забезпечує стандартні операції над множиною типу об'єднання, перетину, віднімання;
winspool.h – заготовочний файл бібліотеки, що містить функції для роботи з чергою;
sstream – визначає декілька класів шаблону, що підтримує операції iostreams на послідовних, збережених в вибраному об’єкті;
fstream (скорочення від «FileStream») — заголовочний файл із стандартной бібліотеки C++, який містить набір класів, методів і функцій, які надають інтерфейс читання/запису даних із/в файл. Для маніпуляції з даними файлів використовуються об’єкти, які називаються потоками («stream»);
iostream — бібліотека і відповідний заголовний файл, які використовується для організації введення-виведення в мові програмування C++. Він включений в стандартну бібліотеку C++. Назва утворена від англ. Input/Output Stream (потік введення-введення). У мові C++ і її попереднику, мові програмування С, немає вбудованого вводу-виводу;
string — стандартна бібліотека мови С, що містить функції для роботи з нуль-термінованими рядками і різними функціями роботи з пам'яттю;
wchar.h — заготовочний файл стандартна бібліотека мови програмування С, частина стандарту розширення можливостей мови 1995 року. Містить функції для роботи мультибайтовими та широкими символами;
windows.h – містить декларацій для всіх функцій у Windows API, всі загальні макроси для Windows, і всі типи даних, що використовуються різними функціями і підсистемами;
stdio.h (від англ. standard input/output – стандартний заголовний файл введення/виведення) заголовний файл стандартної бібліотеки мови С, що містить визначення макросів, констант та оголошення функцій і типів, що використовуються для різних операцій стандартного введення і виведення.
1.3.2. Перелік API функцій для вирішення поставленої задачі.
EnableWindow – функція включає в роботу або відключає мишку і введення з клавіатури в задане вікно або орган управління. Коли введення даних заблокований, вікно не приймає введення кліків миші і натиснень клавіші. Коли введення даних дозволяється, вікно приймає все введення даних.
CreateWindow – функція створює перекриваюче, вистрибуюче або дочірнє вікно. Вона визначає клас, заголовок, стиль вікна та (необов'язково) початкову позицію і розмір вікна. Функція також визначає і вікно батьків або власника, якщо такі є і меню вікна.
CreateWindowEx – створює перекриваюче, вистрибуюче або дочірнє вікно з розширеним стилем; інакше, ця функція ідентична функції CreateWindow.
IsWindowVisible – знаходить дані про стан видимості заданого вікна.
Shell_NotifyIcon – управляє значком, розташованим в області панелі завдань, зазвичай згадується як "system tray". Функція додає новий значок, видаляє існуючий значок, або змінює існуючий значок, що належить програмі, яка викликала запит.
GetDlgItem – витягує дескриптор органу управління в заданому діалоговому вікні.
MessageBox – створює, відображає на екрані і оперує вікном повідомлень. Вікно повідомлень містить визначається програмою повідомлення і заголовок, плюс будь-яку комбінацію зумовлених піктограм і командних кнопок.
LoadImage – завантажує значок, курсор, "живий" курсор або точковий малюнок.
CreatePopupMenu – створює "випадаюче" меню, підменю або контекстне меню. Меню спочатку пусте. Ви можете вставляти або додавати в кінець пункти меню за допомогою використання функції InsertMenuItem. Ви можете також використовувати і функцію InsertMenu, щоб вставляти пункти меню, а функцію AppendMenu, щоб додавати в кінець пункти меню.
AppendMenu – додає в кінець вказаного рядка меню, "випадаючого" меню, підменю або контекстного меню новий пункт.
DestroyWindow – функція використовується для знищення вікон.
DefWindowProc – викликається віконної процедурою за замовчуванням, щоб забезпечити обробку за замовчуванням будь-якого повідомлення вікна, які програма не обробляє.
GetCursorPos – витягує позицію курсору, в екранних координатах.
SetForegroundWindow – переводить потік, який створив визначене вікно в пріоритетний режим і активізує вікно.
TrackPopupMenu – показує на екрані контекстне меню в заданому місці і встановлює підбір пунктів меню.
ShellExecute – може не тільки виконувати заданий додаток, але і відкривати документ і друкувати його. Під терміном «відкрити файл документа» розуміється виконання пов'язаної з ним програми та завантаження в неї цього документа.
SendMessage – відправляє задане повідомлення вікна або вікнам.
CreateEvent – створюється об'єкт подія.
MultiByteToWideChar - функція для створення UNICODE рядків.
GetFileAttributes – витягує встановлені атрибути в стилі файлової системи FAT з вказаного файлу або каталогу.
GetLastError – витягує значення коду останньої помилки у потоці, що її виклакає.
CreateFile – створює або відкриває каталог, фізичний диск, том, буфер консолі, пристрій на магнітній стрічці, комунікаційний ресурс, поштовий слот або іменований канал.
SetFilePointer – переміщає покажчик позиції у відкритому файлі.
GetLocalTime – витягує поточну локальну дату і час.
WriteFile – пише дані у файл з місця, позначеного показчиком позиції у файлі.
ReadFile – читає дані з файлу, починаючи з позиції, позначеної покажчиком файлу.
CloseHandle – закриває дескриптор відкритого об'єкта.
MoveFile – переміщує існуючий файл або каталог, включаючи його дочірні елементи.
FindNextPrinterChangeNotification – витягує інформацію по останньому повідомленні для різноманітності сповіщення об'єкта зміни пов'язаного з принтером або сервером друку.
OpenPrinter – повертає дескриптор принтера або сервера друку.
RegisterWaitForSingleObject – відрізняється від інших функцій очікування, тим, що операція очікування виконується потоком від пулу потоків. Коли задані умови виконані, функція повторного виклику виконується робочим потоком з пулу потоків.
LoadCursor – завантажує заданий ресурс курсору з виконуваного файлу, пов'язаного з примірником прикладної програми.
WaitForSingleObject – функція очікування.
UnregisterWait – для зупинки виклику користувальницької функції очікування.
FindClosePrinterChangeNotification – закриває об'єкт повідомлення зміни створеної викликом функції FindFirstPrinterChangeNotification.
ClosePrinter – закриває принтер, відкритий функцією OpenPrinter.
ResumeThread – зменшує рахунок часу призупинення роботи потоку.
ShowWindow – дана функція встановлює режим відображення вікна.
UpdateWindow – дана функція оновлює клієнтську область вказаного вікна, посилаючи WM_PAINT повідомлення до вікна. Функція посилає WM_PAINT повідомлення безпосередньо процедурі вказаного вікна, минаючи прикладну чергу.
GetMessage – дана функція витягує повідомлення з черги.
DispatchMessage – дана функція розподіляє повідомлення віконної процедури. Зазвичай вона використовується, щоб доставити повідомлення, витягнуте функцією GetMessage.
BeginPaint – дана функція готує задане вікно до фарбування і заповнює структуру PAINTSTRUCT інформацією про фарбування.
GetClientRect – дана функція витягує координати робочої області вікна.
DrawText – дана функція малює відформатований текст в заданому прямокутнику.
EndPaint – дана функція відзначає кінець фарбування в заданому вікні.
ShowCursor – дана функція показує на екрані або приховує курсор.
RegisterClassEx – дана функція реєструє клас вікна для подальшого використання при виконанні функції CreateWindow або CreateWindowEx.
TranslateMessage – дана функція переводить повідомлення віртуальних клавіш в символьні повідомлення.
GetModuleHandle – дана функція витягує дескриптор зазначеного модуля, якщо файл був відображений в адресному просторі викликає процесу.
LoadImage – дана функція завантажує значок, курсор, «живий» курсор або точковий малюнок.
CreatePatternBrush – дана функція створює логічну кисть із заданим точковим малюнком узору.
LoadBitmap – дана функція завантажує заданий ресурс растрового зображення з модуля виконуваного файлу. Ця функція була замінена функцією LoadImage.
PostQuitMessage – функція посилає в чергу повідомлення WM_QUIT кажучи, що процес має бути завершений.
2. АНАЛІЗ ЗАВДАННЯ РОЗРОБКИ СИСТЕМНОЇ УТИЛІТИ СТАТИСТИКИ ДРУКУ ТА СПОСІБ ЙОГО ВИРІШЕННЯ
В даному розділі описується аналіз завдання розробки системної утиліти статистики друку та спосіб його вирішення. Також в цьому розділі розроблена граф-схема алгоритму роботи поставленої задачі та її опис.
2.1. Аналіз завдання
Нерідко у власників принтерів, в першу чергу власників компаній, системних адміністраторів виникає потреба у веденні статистики друку, для зменшення витрат на фарбу чи тонер, оскільки нерідко буває, що робітники друкують власні документи на робочих принтерах, а також важливою інформацією може бути визначення чи повністю був заправлений картридж, нехай інформація про кількість видрукуваних сторінок може бути і не суттєвим документом для фірм, що займаються заправкою картриджів, але це заставить Вас задуматись чи варто користуватись послугами саме цієї фірми. Тому у кожній фірмі, яка дбає про власні витрати використовуються програми для ведення статистики друку. Кожна з таких програми містить як мінімум такі функції:
вибір принтерів для моніторингу;
перегляд статистики друку;
зупинку моніторингу.
Системна утиліта статистики друку яка розробляється в даному курсовому проекті міститиме вище перелічені функції.
А також вимогами до програм ведення статистики друку є якомога менша витрата ресурсів (пам’яті, навантаження на центральний процесор і т.д.) і простий, зручний в користуванні інтерфейс.
У системній утиліті ведення статистики друку будуть відображатись найосновніші поля, що відображатимуть інформацію потрібну для повного використання даної програми, а саме:
дата і час друку;
назва принтера на якому виконуватиметься друк;
кількість сторінок;
назва комп’ютера та користувача, який відправив документ на друк;
назва документа.
2.2. Способи вирішення завдання
Для вирішення завдання розробки системної утиліти ведення статистики друку необхідно використовувати системні виклики операційної системи Windows. Оскільки за допомогою системних викликів ми можемо доступитися до ядра операційної системи, черги друку та забезпечити необхідний інтерфейс роботи з користувачем.
У даному підрозділі приведено розроблений в курсовому проекті алгоритм вирішення поставленого завдання (див. рис.2.1).
При запуску програми перше, що відбувається це ініціалізація інтерфейсу, тобто завантаження вікон, елементів контролю, встановлення початкових значень і т.д.
Наступним етапом, що послідовно буде іти після ініціалізації є використання функції, що за допомогою системних викликів отримує назви доступних принтерів (як локальних так і принтерів, що використовуються спільно в мережі).
Після цього програма повинна очікувати події, які буде викликати користувач за допомогою елементів управління (кнопок, текстових полів, поля списку). Буде розроблено можливість виконання таких операцій, як:
Вибір принтерів та запуск моніторингу.
Зупинка моніторингу.
Підрахування кількості сторінок.
Заміна файлу ( змінення імені файлу ).
/
Рис.2.1. Граф-схема роботи утиліти статистики друку
В залежності від вибраної користувачем операції буде виконуватись відповідна ділянка коду (функції, модулі).
Якщо користувач програми обере операцію 1, то у випадку не обраних принтерів, в полі список, йому буде відображено повідомлення про увагу, де буде йому запропоновано обрати принтери із списку, за якими він хоче «стежити». В іншому випадку буде запущена функція прослуховування повідомлень принтера і запису звітів в файл “print.log”, якщо файлу не існує, то його буде створено. Дана операція буде основана на використанні значної кількості системних викликів, в тому числі і системні виклики для роботи з потоками, адже дана операція передбачає «стеження» за друком та веденням статистики.
Якщо користувач обере операцію 2, то буде припинено моніторинг за принтерами (функцію прослуховування повідомлень принтера). У випадку, коли програма не вела моніторингу, користувача буде повідомлено спеціальним повідомлення про це. У обох випадках будуть використані системні виклик.
Якщо користувач обере операцію 3 то за допомого функції підрахунку кількості сторінок, яка буде використовувати як системні виклики так і функції бібліотеки STL, визначить загальну кількість роздрукованих сторінок у файлі “print.log” і за допомогою спеціального вікна повідомлень відобразить дану кількість користувачеві.
Якщо користувач обере операцію «Заміна файлу», пункт 4, то файл “print.log” буде перейменовано у поточну дату. Дану функцію ефективно буде використовувати для визначення кількості сторінок роздрукованих за певний період. Вона буде містити системний виклик отримання поточної дати і перейменування файлу.
Підсумувавши вище описане необхідно зазначити, що системна утиліта, яка розробляється в даному курсовому проекті буде використовувати потоки, тобто програма буде багатопоточна. А також основу програми будуть становити системні виклики.
3. РОЗРОБКА СИСТЕМНОЇ УТИЛІТИ СТАТИСТИКИ ДРУКУ
Даний розділ містить опис вибраного середовища, мови програмування і типу проекту для виконання роботи і граф-схеми алгоритму програми з описом, а також список використаних функцій.
3.1. Вибір технології програмування
Для виконання поставленого завдання курсового проекту було обрано мову програмування С++, тип проекту Win32 Application та середовище програмування Microsoft Visual Studio 2012.
Тип проекту, Win32 Application, був обраний не з проста, оскільки даний тип проекту є одним із класичних способів створення програм для Windows, а також він забезпечує простоту та зручність використання системних викликів.
Мова програмування, С++, була обрана по причині того, що вона має усі необхідні засоби для роботи з файлами, потоками, процесами в операційних системах Windows. У цієї мови є багато можливостей для реалізації найскладніших алгоритмів і роботи з операційною системою та апаратним середовищем.
Середовище програмування, Microsoft Visual Studio 2012, має ряд переваг, таких як:
перевірка синтаксису в реальному часі;
приємний інтерфейс;
має у своєму складі редактор коду з підтримкою технології IntelliSense і можливістю найпростішого рефакторінгу коду;
вбудований відлагоджувач може працювати не тільки як відлагоджувач рівня програмного коду, а також як відлагоджувач машинного рівня.
3.2. Розробка системної утиліти статистики друку
Принцип роботи розробленої програми наведений на рис. 3.1.
/
Рис.3.1. Граф-схема роботи розробленої системної утиліти статистика друку
Коли користувач запускає програму перше, що відбувається це ініціалізація інтерфейсу, тобто завантаження вікон, елементів контролю, встановлення початкових значень і т.д. Це виконується за допомогою таких системних викликів як: CreateWindow, CreateWindowEx, RegisterClassEx, ShowWindow, UpdateWindow, а також власної розробленої функції InitNotifyIconData – дана функція відповідає за заповнення структури NOTIFYICONDATA для відображення сповіщення в системному треї.
Наступним етапом, що виконується безпосередньо після ініціалізації є використання функції, що за допомогою системних викликів отримує назви доступних принтерів, дана функція була розроблена особисто для виконання цього завдання її назва loadPrinters. Дана функція повертає назви доступних принтерів і за допомогою системного виклику SendMessage з параметром LB_ADDSTRING та дескриптором об’єкту керування список додає назви принтерів у список.
Після виконання описаних вище кроків, програма переходить у вічний цикл while(GetMessage(..)), тобто очікування повідомлень від користувача. Якщо користувач виконає якусь дію тоді за допомогою системних викликів TransalteMessage і DispatchMessage, повідомлення буде оброблене і переправлене у функцію обробки повідомлень WndProc, що служить для виконання вибраної дії користувача. Метод WndProc є базисом проекту типу Win32 Application.
В залежності від обраної користувачем дії виконується відповідна функція.
Припустимо користувач обрав принтери з елемента керування список, за якими він хоче вести статистику друку та натиснув кнопку «Почати», програмою за допомогою циклу та комбінацій системного виклику SendMessage з параметром LB_GETSELITEMS та LB_GETTEXT буде отримано вибрані користувачем принтери і з параметром WM_SETTEXT та дескриптором елемента управління текстове поле буде заповнено текстове поле назвами принтерів за якими ведеться спостереження. А також буде запущена подія, за допомогою системного виклику CreateEvent та власна функція StartMonitor, яка відповідає за створення потоку, що буде виконувати функцію моніторингу заданих принтерів. Можливий і випадок, коли користувач натисне кнопку «Почати» не обравши жодного принтера із списку, то за допомого системного виклику MessageBox йому буде відображене спеціальне повідомлення з зауваженням про це.
Якщо ж користувач натиснув кнопку «Зупинити», то припиняється моніторинг за принтерами, шляхом використання системного виклику SetEvent, оскільки спостереження ведеться до тих пір поки подія не буде встановлена в сигнальний стан. Також за допомогою системного виклику SendMessage буде очищено текстове поле, де були записані принтери за якими вівся моніторинг. У випадку, коли програма не вела моніторингу, користувача буде повідомлено спеціальним повідомлення про це, дане повідомлення буде викликано системним викликом MessageBox.
При натисненні користувачем кнопки «Кількість» програма викликає функцію ReadPageCount – дана функція була мною розроблена для підрахунку суми кількості сторінок у файлі “print.log”. Ця функція повертає кількість сторінок в типі wchar_t*. Для того, щоб відобразити користувачеві в більш зрозумілому вигляді цю кількість, було розроблено ще одну функцію con2str, яка дозволяє об’єднання двох рядків типу wchar_t*, на даному етапі ця функція використовується для об’єднання рядків L“Кількість сторінок: ” та результату, що повернула функція ReadPageCount. І вже після цього користувачу буде відображено скоректований рядок у новому вікні повідомлень, шляхом використання системного виклику MessageBox.
Коли користувач програми натисне кнопку «Змінити файл» буде викликана розроблена мною функція для перейменування файлу “print.log”, у назву яка відповідає наведеному нижче форматі:
[ЧИСЛО]_[МІСЯЦЬ]_[РІК]
Для перейменування файлу використовується системний виклик MoveFile. Дата, що використовується для назви файлу береться за допомогою використання системного виклику GetLocalTime, проте детальніше інформація по розроблених мною функція буде наведена дальше.
Необхідно зазначити, що згадувані вище написані мною функцію використовують системні виклики, методи бібліотеки STL, та інші мною написані функції для реалізації поставленого завдання, тобто системної утиліти статистики друку.
Розглянемо алгоритм роботи функції PRINTER_INFO_2 * loadPrinters(), яка повертає масив структури PRINTER_INFO_2* з яких просто визвавши їх поля pPrinterName отримуємо назви доступних принтерів. І вже за допомогою SendMessage заповнюєм елемент керування список. Алгоритм функції loadPrinters() наведено на рис.3.2.
/
Рис.3.2. Граф-схема алгоритму роботи функції loadPrinters
Функція не приймає жодних параметрів. На початку функції здійснюється ініціалізація змінних, встановлюються прапорці PRINTER_ENUM_LOCAL | PRINTER_ENUM_NETWORK, які вказують на пошук принтерів як локальних, так і доступних в мережі. За допомогою системного виклику EnumPrinters отримуємо кількість необхідних байт для буфера в змінній bytesNeeded. За допомогою системного виклику GetLastError робимо перевірку чи попередня операція завершилась успішно, якщо ні то виводиться повідомлення про помилку системним викликом MessageBox і функція loadPrinters завершує свою роботу. В іншому випадку, коли помилок не було, виділяємо для змінної printerBuffer необхідну кількість байт за допомогою функції malloc. Якщо динамічно виділити пам’ять не вдалось виводимо користувачеві повідомлення про помилку і завершаємо виконання функції. У випадку, коли видалення пам’яті пройшло успішно за допомогою системного виклику EnumPrinters, записується в змінну printerBuffer імена усіх доступних принтерів. Після цього здійснюється перевірка чи попередній системний виклик завершився успішно. Якщо була помилка