89895

Розробка програми для запускату процесів використовуючи вибрані на диску файли

Курсовая

Информатика, кибернетика и программирование

Завдання Написати програму, яка дозволяє запускати процеси, використовуючи для цього вибрані на диску файли. Користувач може задавати ім’я запускається файлу і командний рядок. Програма стежить за всіма запущеними нею процесами і виводить на вимогу користувача наступну інформацію: ім’я процесу, значення покажчика...

Украинкский

2015-05-16

427 KB

0 чел.

РЕФЕРАТ

Курсова робота:  30 с.,  4 рис., 6 джерел, 1 додатки.

7 Варіант

Завдання Написати програму, яка дозволяє запускати процеси, використовуючи для цього вибрані на диску файли. Користувач може задавати ім'я запускається файлу і командний рядок. Програма стежить за всіма запущеними нею процесами і виводить на вимогу користувача наступну інформацію: ім'я процесу, значення покажчика та ідентифікатора процесу, час виконання процесу.

Мета роботи – отримати навички коректного  використання операторів та конструкцій та побудова ефективних алгоритмів для розв’язку задачі.

Одержані висновки: розроблені алгоритми та складені програми для обробки графічних зображень.


ЗМІСТ

ВСТУП 3

  1.  ТЕОРЕТИЧНА ЧАСТИНА 5
    1.  Основи розробки додатків Windows 5
    2.  Головна функція WinMain 7
    3.  Параметри функції WinMain 8
    4.  Склад функції WinMain() 9
  2.  ПРАКТИЧНА ЧАСТИНА 16
    1.  Постановка задачі 16
    2.  Використовуючи файли на диску запускати процеси 16
    3.  Відслідковувати кожен з процесів(його статус, назву, час життя). 18
    4.  Відслідковувати діяльність користувача 20

   2.5 Інші функції, використані в програмі 21

   2.6 Опис алгоритму роботи програми 22

ВИСНОВОК 23

ДЖЕРЕЛА 24

ДОДАТОК А 25


ВСТУП

Windows API спроектований для використання в мові Сі для написання прикладних програм, призначених для роботи під управлінням операційної системи MS Windows.

Windows API являє собою безліч функцій, структур даних і числових констант, наступних угодами мови С. Всі мови програмування, здатні викликати такі функції і оперувати такими типами даних в програмах, що виконуються в середовищі Windows, можуть користуватися API.

Для полегшення програмування під Windows, в компанії Microsoft і сторонніми розробниками було зроблено безліч спроб створити бібліотеки і середовища програмування, частково або повністю приховують від програміста особливості Windows API, і надають ту чи іншу частину його можливостей у більш зручному вигляді. Є крос-платформні бібліотеки, такі як Qt, Tk. Вагома частина цих бібліотек сконцентрована на полегшенні програмування графічного інтерфейсу користувача.

Функціонально Win32 API підрозділяється на наступні категорії:

  •  Network Services (мережеві сервіси);
  •  Base Services (базові сервіси);
  •  Graphics Device Interface (інтерфейс графічних пристроїв);
  •  Common Control Library (бібліотека спільних елементів управління);
  •  User Interface (інтерфейс користувача);
  •  Windows NT Access Control (управління доступом для Windows NT);
  •  Windows Shell (оболонка Windows);
  •  Windows System Information (інформація про систему).

Щоб зробити інтерфейс Win32 АРI більш незалежним від конкретної мови програмування або більш відповідним апаратному забезпеченню комп'ютера, розробники цього інтерфейсу визначили нові прості типи даних. Ці типи даних використовуються в прототипах функцій інтерфейсу Win32 АРI. Нові прості типи даних визначені як синоніми простих типів даних мови програмування С. Щоб відрізняти ці типи від інших типів, їх імена визначені прописними буквами.


1. ТЕОРЕТИЧНА ЧАСТИНА

1.1 Основи розробки додатків Windows

Програма починається з двох директив препроцесора #include, за допомогою яких до програми підключаються заголовні файли. Заголовки WINDOWS.H забезпечує розуміння компілятором сенсу типів даних Windows, констант і макросів і підключення цього файлу до вихідного тексту програми є обов'язковим. Частина визначень, що використовуються в програмах міститься у файлі WINDOWS.H, який також необхідно включати практично в усі додатки Windows.

Слідом за операторами препроцесора йде розділ прототипів, де визначається прототип єдиною в даній програмі прикладної функції WndProc. Но загально в програмі обов'язково повинні бути вказані прототипи всіх використовуваних функцій, як прикладних, так і системних. Викликів системних функцій Windows багато: RégisterCIass(), CreateWindowQ, GetMessage () та ін. Однак прототипи всіх цих функцій вже визначені в заголовних файлах системи програмування. Так, прототип функції WinMain описаний у файлі WINBASE.H:

Заголовок функції WinMain () в програмі в точності відповідає прототипу. Прототипи інших використаних в програмі функцій Windows визначені у файлі WINUSER.H. Таким чином, про прототипи функцій Windows можна не піклуватися.

Інше становище з віконною функцією WndProc (). Це прикладна функція, її ім'я може бути яким завгодно, і системі програмування це ім'я невідоме.

При наявності в додатку декількох вікон в програмі описується кілька віконних функцій, по одній для кожного класу вікон. Для всіх використовуваних в програмі віконних функцій необхідно вказувати їх прототипи.

З іншого боку, формат віконної функції, тобто кількість і типи вхідних параметрів функції, як і тип повертається нею значення, визначені системою Windows і не можуть бути довільно змінені. Віконна функція визивається з Windows при вступі у додаток того чи іншого повідомлення. При її виклику Windows передає їй цілком певний список параметрів, і функція повинна мати можливість ці параметри прийняти і працювати з ними. Тому в інтерактивному довіднику системи програмування дається шаблон (template) віконної функції, який за своїм виглядом дуже схожий на прототип, однак є не прототипом конкретної функції, а заготівлею для програміста:

У файлі WINDEF.H символічне позначення CALLBACK оголошується рівнозначним ключовим словом мови C ++ stdcall, яке визначає правила взаємодії функцій з зухвалими процедурами. У Win32 практично для всіх функцій діє так звана угода стандартного виклику. Ця угода визначає, що при виклику функції її параметри поміщаються в стек в такому порядку, що в глибині стека виявляється останній параметр, а на вершині - перший. Сама функція знає при якому розташуванні її параметрів і вибирає їх з стека в правильній послідовності. Для 16-розрядних функцій Windows діє угода мови Паскаль, при якому порядок приміщення параметрів в стек зворотний.

Функціонування додатки Windows

Програма складається з двох функцій: головної функції, завжди має ім'я WinMain, і так званої віконної функції (віконної процедури) WndPгoc. При запуску програми Windows управління завжди передається функції WinMain, яка, таким чином, має бути присутня у будь-якій програмі. Більше того, ця функція, маючи в принципі циклічний характер, виконується протягом всього життя додатки. Основне призначення функції WinMain - виконання ініціюючих дій і організація циклу виявлення повідомлень.

Ініціюючі дії, що виконуються у функції WinMain(), полягають у реєстрації класу головного вікна, створенні цього вікна і його показі, тобто виведенні на робочій стіл Windows. Ці дії здійснюються викликом відповідних функцій Windows: RegisterClass(), CгeateWindow () і ShowWindow ().

Виконавши необхідні ініціалізували дії, головна функція WinMain() входить в нескінченний цикл виявлення повідомлень. Завдання функції WinMain полягає в прийомі цього повідомлення і передачі його друга найважливішого компоненту будь-якого додатку Windows - віконної функції.

Функція GetMessage () аналізує чергу повідомлень додатка. Якщо в черзі виявляється повідомлення, GetMessage вилучає його з черги і передає в додаток. Виконувана далі функція DispatchMessage () викликає віконну функцію, передаючи їй всі дані, що входять до повідомлення.

Віконна функція складається з стількох фрагментів, скільки конкретних повідомлень передбачається обробляти в цьому додатку. Якщо, наприклад, додаток повинен відслідковувати координати миші, то у віконну функцію слід включити фрагмент обробки повідомлень про переміщення миші; якщо, крім цього, програма має реагувати на сигнали від таймера, у віконну функцію включається фрагмент обробки повідомлень від таймера. Всі інші повідомлення, які можуть надійти в додаток, але які нас не цікавлять, передаються функції Windows DefWindowProc (), яка виконує мінімально необхідну обробку будь-яких повідомлень.

У програмі не передбачено виконання будь-яких прикладних дій; користувач може тільки змінювати за допомогою миші розміри вікна, переміщати його по робочому столу або, натиснувши на кнопку з хрестиком, завершити додаток. З іншого боку, всі елементи програми входять з тими чи іншими варіаціями практично в будь-який додаток Windows.

1.2 Головна функція WinMain

Головна функція додатка WinMain() починається з визначення змінних, які будуть використовуватися в програмі. У програмах для Windows часто включають в ім'я кожної змінної ще й інформацію про її типі. Це робиться за допомогою так званої угорської нотації.

Суть угорської нотації полягає в тому, що ім'я змінної або функції передує однією або декількома буквами - префіксом, що говорить про тип цієї змінної. Так, префікс п позначає цілочисельну змінну, sz- символьний рядок, що закінчується двійковим нулем, h - дескриптор того чи іншого об'єкта. Звідси і взялися кілька незграбні на перший погляд імена змінних szClassName і szTitle. Угорська система широко використовується в описах внутрішніх структур Windows. Так, у структурі типу WNDCLASS, з якою має справу функція Register (), є члени IpszClassName (Ipsz - long pointer string zero, далекий покажчик на символьний рядок), IpfhWndProc (Ipfn - long pointer function, далекий покажчик на функцію), hlcon ( h - handle, дескриптор) та ін.

1.3 Параметри функції WinMain

Викликаючи функцію WinMain(), Windows передає їй 4 обумовлених аргументу, які, вступаючи у функцію WinMain(), стають її внутрішніми локальними параметрами.

Перший параметр типу HISTANCE, якому для стислості дано ім'я hInst являє собою дескриптор даного екземпляра додатка. Він призначається додатку при його запуску системою Windows і служить для його ідентифікації. Багато функцій Windows використовують цей дескриптор в якості вхідного параметра, тому необхідно зберігати його в глобальній змінній, щоб зробити доступним всіх функцій програми.

Другий параметр того ж типу, який в документації названий hPrevInstance, в 16- розрядних додатках був дескриптором попереднього примірника цього ж додатка і брав нульове значення, якщо додаток запускалося в декількох екземплярах. Аналізуючи значення параметра hPrevInstance, можна було визначити, чи є даний екземпляр додатку першим. В Win32 цей параметр завжди дорівнює нулю і не має сенсу. Відповідно немає необхідності передбачати для нього локальну змінну, тому в заголовку функції WinMain () зазначений тільки тип другого параметра (HINCTANCE), але немає позначення змінної.

Наступний параметр, lpzCmdLine, являє собою вказівник на рядок, що містить параметри командного рядка запуску програми, якщо воно запускалося через кнопку "Пуск 'і при його запуску крім імені програми були зазначені ще які-небудь параметри.

Останній параметр, nCmdShow, характеризує режим запуску. Режим запуска будь-якої програми можна встановити, якщо, створивши ярлик програми, відкрити для нього вікно "Властивості", перейти на вкладку "Ярлик" і розкрити список "Вікно". Якщо, далі, вибрати в цьому списку пункт "Згорнуте в значок", Windows, запускаючи додаток, буде згортати його в піктограму. У цьому випадку з Windows в WinMain поступає значення параметру SW_SHOWMlNNOACTIVE = 7. Якщо ж включений режим Стандартний розмір, вікно додатку на екрані розгортається до розміру, заданого в самому додатку, а в WinMain() надходить константа SWSHOWNORMALH. Отриману через параметр nCmdShow константу можна потім використовувати як параметр при виклику функції Windows ShowWindow.

Внутрішні, діючі в програмі імена для параметрів функції WinMain, як і в принципі для будь-якої іншої функції, користувач може вибирати на свій розсуд.

1.4 Склад функції WinMain()

У типовому додатку Windows головна функція WinMain() повинна виконати щонайменше 3 важливі процедури:

  •  Зареєструвати в системі Windows клас головного вікна. Якщо крім головного вікна планується виводити на екран внутрішні, породжені вікна, то їх класи також необхідно зареєструвати. Windows виводить на екран і обслуговує тільки зареєстровані вікна.
  •  Створити головне вікно і показати його на екрані. Породжені вікна також необхідно створити, хоча це можна зробити і пізніше, і не обов'язково у функції WinMain().
  •  Організувати цикл виявлення повідомлень, що надходять в додаток, а також додаток повідомлень. Запущене застосування Windows зазвичай функціонує доти, поки користувач не подасть команду його завершення за допомогою системного меню або введенням команди Alt + F4. Ці дії призводять до завершеня головної функції і видаленню програми зі списку діючих завдань.

Клас вікна і його характеристики

Для виводу на екран будь-якого вікна, зокрема головного вікна програми, необхідно насамперед зареєструвати клас вікна, в якому задаються найбільш загальні характеристики всіх вікон даного класу. Ця дія виконується в першій частині функції WinMain ().

Дії з реєстрації класу вікна полягають у заповненні структури типу WNDCLASS, що служить для опису характеристик класу реєстрованого вікна, і визові потім функції Windows RegisterClass (), яка і виконує реєстрацію даного класу.

Структура WNDCLASS, визначена у файлі WINUSER.H, містить ряд членів, які задають найбільш загальні характеристики вікна.

При заповненні структурної змінної типу WNDCLASS необхідно забезпечити нульове значення всіх елементів, яким не присвоюється конкретні значення. Нульове значення елемента структури позначає для Windows, що характеристики цього елемента повинні встановлюватися за замовчуванням. Це правило, до речі, характерно і для інших структур, що описують ті чи інші об'єкти Windows, наприклад для структури OPENFILENAME, що служить для виводу на екран стандартного діалогу Windows "Відкриття файлу", йди структури LOGFONT, що дозволяє створити шрифт необхідного начертання.

Можна не обнуляти структуру Msg явним чином, а скористатися тією обставиною, що глобальні змінні обнуляються автоматично. Якщо змінну wc розташувати перед функцією WinMain, то при завантаженні програми в пам'ять вона буде заповнена нулями і у виклику функції ZeroMemory не буде необхідності. Якщо деяка змінна потрібна тільки в конкретній функції, її краще оголосити всередині цієї функції і зробити тим самим локальної. Локалізація змінних зменшує витрату пам'яті і підвищує надійність програми. Так чи інакше, якийсь засіб обнулення використовувати необхідно; в іншому випадку структура виявиться заповненою "сміттям", що при запуску програми швидше за все призведе до драматичних наслідків.

Найбільш важливими для подальшого функціонування програми є три поля структурної змінної wc: hlnstance, де зберігається дескриптор даного додатку, IpszClassName, куди заноситься довільне ім'я, присвоєне нами вікнам даного класу (у нас це вікно єдине) і lpfhWndProc - ім'я віконної функції. Саме за допомогою структури WNDCLASS Windows, визначає адресу віконної функції, яку вона повинна викликати при вступі у вікно повідомлень. Поле IpszClassName заповнюється із змінної szClassName; визначеної на початку програми, а значення дескриптора додатки переноситься з параметра hlnst функції WinMain ().

Менш важливими в принциповому плані, але істотними для розумного поведіння додатки є поля hIcon, hCursor і hbrBackground, куди слід записати дескриптори піктограми, курсору і кисті, яка використовується для зафарбовування робочої області вікна.

Курсор відноситься до ресурсів Windows; ресурси зазвичай завантажуються з спеціально створеного файлу ресурсів за допомогою відповідних функцій Windows, зокрема LoadCursor(). В якості першого аргументу цих функцій вказується дескриптор додатки, в якому зберігається необхідний ресурс, а в якості другого - ім'я ресурсу. Однак можна обійтися і вбудованими ресурсами Windows. Для цього в якості першого аргументу цих функцій вказується NULL (зазвичай NULL на місці дескриптора додаток позначає саму систему Windows); другий аргумент треба вибрати зі списку вбудованих ресурсів Windows.

Іншим ресурсом Windows, вказуються у класі вікна, є піктограма. Як і курсор, піктограма може бути розроблена програмістом спеціально для цього додатка і зберігатися у файлі ресурсів застосування або в окремому файлі з розширенням ІСО.

Для того щоб додати додатку необхідну піктограму, треба при заповненні структурної змінної wc типу WNDCLASS завантажити дескриптор піктограми в елемент wc.hIcon. Для отримання дескриптора слід скористатися функцією LoadIcon().

Колір фону вікна визначається дескриптором кисті, записаним в структуру WNDCLASS. В принципі кисті можна надати будь-який колір, але найпростіше користуватися однією з вбудованих кистей, що зберігаються на "складі" windows. Для отримання вбудованої кисті слід скористатися макросом getStockBrash(), в якості єдиного аргументу якого вказується константа, що характеризує колір кисті. Можливі значення констант (їх дуже небагато).

Для створення кисті служить функція CreateSolidBrush(), в якості єдиного параметра якій вказується необхідний колір у вигляді трьох чисел, який характеризує інтенсивність червоною, зеленою і синій складових кольору. Для упаковки цих трьох чисел в одне 4-байтовий слово і перетворення отриманого значення в тип COLORREF, необхідний функцією CreateSolidBrush, служить макрос RGB().  

Стиль є ціле число (32 біта), окремі біти якого закріплені за тими чи іншими загальними характеристиками всіх вікон, які належать класу, який зареєстрований; кожному біту відповідає своя символічна константа. Так, установка біта 3 дозволяє програмі реагувати на подвійні клацання мишею в області вікна; установка бітів 0 і змушує Windows перемальовувати вікно заново при кожній зміні його розмірів по горизонталі і вертикалі; установка біта 9 забороняє закриття вікна користувачем і т.д.

Функція RegisterClass() вимагає в якості аргументу адресу структурної змінної типу WNDCLASS.

Зареєструвавши клас вікна, можна приступити до його створення і виведення на Робочий стіл.

Створення і показ вікна

Для створення вікна, зокрема головного вікна програми, використовується функція Windows CreateWindow(), прототип якої можна знайти в інтерактивному довіднику.

Істотними елементами прототипу є порядок і типи параметрів; вказівка ​​в довіднику та необов'язкову рекомендацію. У програмі строка з ім’ям класу вікна названа szClassName, рядок із заголовком вікна – szTitle, а в якості параметрів використані символічні або числові константи.

Перший параметр IpClassName - адреса рядка з ім'ям реєстрованого класу вікна. Передача функції CreateWindow() імені класу дозволяє використовувати при створенні вікна ті загальні характеристики вікна, які були визначені в структурі WNDCLASS, наприклад форму курсора і колір фону. Викликаючи функцію CreateWindow() багаторазово, можна створити багато вікон даного класу, що розрізняються, наприклад, розмірами і розташуванням на екрані.

Параметр IpWindowName визначає адресу рядки з заголовком, який з'явиться у верхній частині вікна.

Параметр dwStyle визначає стиль вікна. За допомогою стилю задаються такі характеристики вікна, як вид навколишнього його рамки, наявність або відсутність рядка заголовка і цілий ряд інших. Стиль є ціле число (32 біта), окремі біти якого закріплені за тими чи іншими елементами оформлення або властивостями вікна; кожному біту відповідає своя символічна константа. Так, установка біта 18 надає вікну товсту рамку; установка біта 19 постачає вікно системним меню; біт 21 відповідає за появу лінійки вертикальної прокрутки і т.д. операція побітового АБО (знак |) дозволяє "набрати" необхідний комплект властивостей.

Зазвичай головне вікно описується константою WS_OVERLAPPEDWINDOW. Якщо потрібно створити головне вікно з меншою кількістю елементів, весь необхідний набір можна вказати явним чином.

З іншого боку, скориставшись операторами побітових операцій І (&) і НЕ (~), можна не набирати заново всю комбінацію констант, а просто виключити НЕ-потрібний елемент WS_MAXHMlZEBOX з повного набору:

WS OVERLAPPEDWINDOW & -WS MAXIMIZEBOX

Наступні 4 параметри визначають х- і у-координати лівого верхнього кута вікна відносно початку Робочого столу і розміри вікна по горизонталі і вертикалі (в пік-селах).

Як параметр hWndParent вказується дескриптор батьківського вікна. Для головного вікна, у якого немає батька, використовується константа HWND_ DESKTOP.

Параметр hMenu дозволяє задати меню вікна. Якщо меню немає (як у нашому випадку) або використовується меню класу, задане в структурі WNDCLASS, цей параметр повинен бути рівний нулю (MULL).

Параметр hlnstance ідентифікує екземпляр додатку. Значення дескриптора додатки було отримано нами через параметр hlnst функції WinMainQ.

Останній параметр IpParam є адресою додаткових даних, які зазвичай не потрібні.

Символічне позначення NULL (нуль-покажчик) використовується в тих випадках, коли для деякої функції треба вказати нульове значення параметра.

Функція CreateWindow () при успішному виконанні  повертає дескриптор утвореного вікна. Цей дескриптор передається в функцію ShowWindow(), котра організує виведення створеного вікна на екран. Тепер для правильного функціонування додатку необхідно організувати цикл  повідомлень.

Цикл виявлення повідомлень

Цикл виявлення повідомлень в найпростішому вигляді складається з одного

У цьому нескінченному (якщо його не розірвати зсередини) циклі викликається функція Windows GetMessage (), і, якщо вона повертає нульове значення, викликається функція DispatchМеssаgе(). Призначення циклу обробки повідомлень - отримання повідомлень, що надходять в додаток, і виклик у відповідь на кожне повідомлення віконної процедури для обробки цього повідомлення.

Якщо протягом якогось часу повідомлення в додаток не надходять, цикл обробки повідомлень "крутиться" вхолосту. Як тільки у черзі виявляється повідомлення, функція GetMessage забирає його з черги і переносить в структурну змінну, призначену для прийому повідомлень. Викликається далі функція DispatchMessage() викликає віконну процедуру того вікна, якому призначено дане повідомлення, і передає їй (через її параметри) вміст повідомлення зі структури Msg. Завдання віконної процедури - виконати необхідну обробку повідомлення. Коли віконна процедура завершить обробку отриманого повідомлення, управління повернеться в цикл обробки повідомлень, який продовжить своє циклічне виконання в очікуванні нового повідомлення.


2. ПРАКТИЧНА ЧАСТИНА

Завдання: Написати програму, яка дозволяє запускати процеси, використовуючи для цього вибрані на диску файли. Користувач може задавати ім'я запускається файлу і командний рядок. Програма стежить за всіма запущеними нею процесами і виводить на вимогу користувача наступну інформацію: ім'я процесу, значення покажчика та ідентифікатора процесу, час виконання процесу.

2.1 Постановка завдання

Данну програму можна написати, розділивши її на 3 частини:

1. Необхідно запускати процеси, використовуючи для цього вибрані на диску файли.

2. Відслідковувати кожен з процесів(його статус, назву, час життя).

3. Відслідковувати діяльність користувача, і якщо він захотів вивести розгорнуту інформацію про всі процесі замість згорнутої обробити його запит.

Всі частини завдання будуть виконанні на мові WinApi32 з використанням відповідних функцій та методів.

2.2 Запуск  процесу, використав для цього вибрані на диску файли.

Найпростіший спосіб дозволити користувачу завантажити файл з будь яким ім’ям це використати стандартний огляд MS Windows з невеликими правками.

Windows надає набір готових стандартних діалогів через бібліотеки Common Dialog Boxes Library (COMDLG32.DLL): діалог відкриття і збереження файлу, діалог друку документа, діалог вибору кольору, шрифту. Щоб створити один з перерахованих діалогів, треба заповнити певну структуру і викликати відповідну функцію з цієї бібліотеки в моєму випадку це:

BOOL WINAPI GetOpenFileName (OPENFILENAME * lpofn) створюють діалог, що відображає вміст того чи іншого каталогу, і дозволяе поставити користувачеві вибрати унікальне ім'я файлу для відкриття.

Синтаксис:

char filename[MAX_PATH]="";             

OPENFILENAME of;

of.lStructSize=OPENFILENAME_SIZE_VERSION_400A;

of.hwndOwner=hw;                        

of.hInstance=h;                         

of.lpstrFilter="All files (*.*)\0*.*\0";

of.lpstrCustomFilter=NULL;              

of.nMaxCustFilter=0;                    

of.nFilterIndex=1;                      

of.lpstrFile=filename;                  

of.nMaxFile=MAX_PATH;                    

of.lpstrFileTitle=NULL;                 

of.nMaxFileTitle=0;                     

of.lpstrInitialDir=NULL;                  of.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;

if (GetOpenFileName(&of)) {}

char filename[MAX_PATH]          

буфер який буде містить ім’я завантаженого файлу.

of.hwndOwner  

Це дескриптор родительського вікна.

of.hInstance=h   

Дескриптор екземпляра програми.                      

of.lpstrFilter

Фільтр файлів які будуть доступні для завантаження.

of.lpstrCustomFilter та of.nMaxCustFilter;  

Також фільтри але вже для файлів які необхідно декілька разів запустити.                

of.nFilterIndex 

Загальна кількість використаних файлів.

of.lpstrFile

Адреса буфера виділеного під ім’я файлу.               

of.nMaxFile

Розмір буфера виділений під ім’я файлу.                 

of.lpstrFileTitle

Буфер під рекомендовані заголовки.

of.nMaxFileTitle

Розмір буфера для рекомендованих заголовків.                    

of.lpstrInitialDir

Стартовий каталог (за замовчанням це поточний каталог)

Рис. 1 Результат використання функції GetOpenFileName

2.3 Відслідковувати кожен з процесів(його статус, назву, час життя).

Після того я файл був обраний він запускається у процесі, а процес створюється за допомогою: CreateProcess.

CreateProcess имеет следующий прототип:

BOOL CreateProcess(

LPCTSTR  lpApplicationName,  // ім’я виконуючого модуля  

LPTSTR  lpCommandLine,   // командна строчка

LPSECURITY_ATTRIBUTES  lpProcessAttributes, // захист процесу

LPSECURITY_ATTRIBUTES  lpThreadAttributes,  // захист потока

BOOL  bInheritHandles,   // ознак наслідування дескриптору

DWORD  dwCreationFlags,   // прапорці створення процесу

LPVOID  lpEnvironment,   // блок нового середовища

LPCTSTR  lpCurrentDirectory,   // поточний каталог  

LPSTARTUPINFO  lpStartUpInfo,  // головне вікно

LPPROCESS_INFORMATION  lpProcessInformation  // інформація о процесі

);

 

За роботою кожного з процесів слідкує функція: IsProcessStillRunning ця функція перевіряє активний або неактивній процес.  

Час життя вимірює звичайним таймером: WM_TIMER який підраховує скільки працює кожен з процесів.

СинтаксисWM_TIMER:
WM_TIMER

(
    WPARAM wParam
    LPARAM lParam;

)

wParam

[in] Визначає ідентифікатор таймера.

lParam

[in] Покажчик на певну програмою функцію зворотного виклику, яка передавалася в функцію SetTimer, коли таймер був встановлений.

І вся інформація про кожен з процесів передається вже у повідомлені WM_PAINT. Додаток малює у вікні у відповідь на повідомлення. Система посилає це повідомлення віконної процедури, коли змінює у вікні перероблене вміст робочої області. Система посилає повідомлення тільки тоді, якщо немає ніяких інших повідомлень в черзі повідомлень прикладної програми.

Синтаксис WM_PAINT:

LRESULT CALLBACK WindowProc(

 HWND hwnd,       // дескриптор вікна

 UINT uMsg,       // WM_PAINT

 WPARAM wParam,   

 LPARAM lParam    

);

 

 

Рис. 2 виведення розгорнутої інформації про запущений процес

2.4 Відслідковувати діяльність користувача

У завдані чітко вказано що не обхідно виводити інформацію тільки в тому випадку якщо користувач так захоче.

Це було реалізовано за допомогою  WM_RBUTTONDOWN яка виконує певні дій на натиснуту праву кнопку миші. Є глобальна змінна button_check дані якої перезаписуються з 0 на 1 та навпаки при натиснутій правій клавіші миші. Після чого у WM_PAINT виконується один с двох варіантів виконання при button_check = 0 дивитись рисунок 3 та при button_check =1 дивитись рисунок 4.

Синтаксис WM_RBUTTONDOWN

WM_RBUTTONDOWN

   WPARAM wParam

   LPARAM lParam;

Рис 3. Стисла інформація про процес

Рис 4. розгорнута інформація про процес

2.5 Інші функції, використані в програмі

WM_DESTROY

Це повідомлення надсилається коли необхідно знищити вікно. Після видалення його з екрана. Надсилається повідомлення спочатку головного вікна, а потім дочірнім вікнам. Після прийняття цього повідомлення необхідно викликати функцію PostQuitMessage (). Повідомлення про руйнування вікна надійде саме віконної процедури, а не в стандартній черзі повідомлення.

Також у цій функцій використовується KillTimer який виключає таймер щоб він не висів у системі навіть після виключення програми.

2.6 Опис алгоритму роботи програми

При старті програми користувачеві необхідно у полі меню вибрати пункт StartExe після чого для нього відкриється вікно оглядача в якому він повинен буде обрати файл для запуску у програмі. Файли можуть бути лише з розширенням .ехе. Обраній файл запускається у процесі, програма може підтримувати у робочому стані двадцять процесів одночасно. Після того як процес було створено за його статусом слідкує IsProcessStillRunning ця функція перевіряє активний або неактивній процес і передає параметри у таймер WM_TIMER який підраховує скільки працює кожен з процесів до поки від функції IsProcessStillRunning не прийде підтвердження що користувач завершив процес у цьому випадку статус процесу зминеться з ACTIVE на STOPED, а таймер припинить підраховувати час життя процесу.  

Якщо користувач під час роботи процесів натисне правою кнопкою миші на робочої області програми він отримає розгорнуту інформацію по кожному з процесів навіть по тим що вже завершили роботу за цим слідкує WM_RBUTTONDOWN завдяки глобальній змінній яка змінює своє значення з 0 на 1 та навпаки при натисканні на праву клавішу миші. Вся інформація передається у WM_PAINT де існує два способи виводу інформації стислий та розгорнутий і варіюється вони в залежності від того що записано у глобальній зміні. Для того щоб завершити виконання програми необхідно вибрати пункт вихід у меню програми або натиснути на хрестик у правому верхньому куті вікна, в цьому випадку знищується батьківське вікно, а разом з ним всі дочірні, також припиняє свою роботу таймер.


ВИСНОВКИ

В курсовій роботі було вирішена поставлена задача, для цього були використані функції, масиви, цикли та інше. Були здобуті навички роботи з файлами, процесами та обробка даних цих процесів . В процесі розробки були здобуті навички роботи з програмним забезпеченням Microsoft Visual Studio, з використанням стандартних бібліотек та функцій Win API.


СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Финогенов К.Г. Win32. Основы программирования. – 2-е изд., испр. и дополн. – М.: ДИАЛОГ – МИФИ, 2006. – 416 с.

2. Побегайло А.П. Системное программирование в Windows, - СПб.: БХВ – Петербург, 2006. - 1056 с.: ил.

3. Литвиненко Н.А. – Технология программирования на С++. Win32 API-приложения – 2010.

4. Рихтер Дж. Windows для профессионалов: создание эффективных Win32- приложений с учетом специфики 64-разрядной версии Windows: Пер. с англ.

5. Шупак Ю. А. Win32 АР1. Разработка приложений для \Vindows. — СПб.: Питер, 2008.

6. Верма Р. Д. Справочник по функциям Win32 АР1. — 2-е изд., перераб. и доп М.: Горячая линия — Телеком, 2005.


ДОДАТОК А

// Kurs.cpp: определяет точку входа для приложения.

//

#include "stdafx.h"

#include "Kurs.h"

#include <Windows.h>

#include <CommDlg.h>

#define MAX_LOADSTRING 100

#define MAX_PROCESSES 20

#define IDT_TIMER 1000

int button_check=0;

// Глобальные переменные:

HINSTANCE hInst;        // текущий экземпляр

TCHAR szTitle[MAX_LOADSTRING];     // Текст строки заголовка

TCHAR szWindowClass[MAX_LOADSTRING];   // имя класса главного окна

TCHAR filename[MAX_PATH]; /*буфер под имя файла*/

TCHAR filters[] = "Program files (.)\0*.exe\0";

OPENFILENAME of;

HPEN hPen;

typedef struct {

STARTUPINFO si;

PROCESS_INFORMATION pi;

TCHAR process_name[MAX_PATH];

 volatile UINT nCount;

} PROCESS;

PROCESS processes[MAX_PROCESSES];

int current_process;

// Отправить объявления функций, включенных в этот модуль кода:

ATOM    MyRegisterClass(HINSTANCE hInstance);

BOOL    InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

void StartExe(HWND);

bool IsProcessStillRunning(PROCESS p);

int APIENTRY _tWinMain(HINSTANCE hInstance,

                    HINSTANCE hPrevInstance,

                    LPTSTR    lpCmdLine,

                    int       nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

 // TODO: разместите код здесь.

MSG msg;

 HACCEL hAccelTable;

 // Инициализация глобальных строк

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_KURS, szWindowClass, MAX_LOADSTRING);

 MyRegisterClass(hInstance);

 // Выполнить инициализацию приложения:

 if (!InitInstance (hInstance, nCmdShow))

{

 return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_KURS));

 // Цикл основного сообщения:

 while (GetMessage(&msg, NULL, 0, 0))

 {

 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

 {

  TranslateMessage(&msg);

  DispatchMessage(&msg);

 }

}

 return (int) msg.wParam;

}

//

//  ФУНКЦИЯ: MyRegisterClass()

//

//  НАЗНАЧЕНИЕ: регистрирует класс окна.

//

//  КОММЕНТАРИИ:

//

//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код

//    был совместим с системами Win32, не имеющими функции RegisterClassEx'

//    которая была добавлена в Windows 95. Вызов этой функции важен для того,

//    чтобы приложение получило "качественные" мелкие значки и установило связь

//    с ними.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style   = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra  = 0;

wcex.cbWndExtra  = 0;

wcex.hInstance  = hInstance;

wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_KURS));

wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_KURS);

wcex.lpszClassName = szWindowClass;

wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

 return RegisterClassEx(&wcex);

}

//

//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)

//

//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.

//

//   КОММЕНТАРИИ:

//

//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также

//        создается и выводится на экран главное окно программы.

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

  HWND hWnd;

  hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

  hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  if (!hWnd)

  {

     return FALSE;

  }

   // Set the timer for the mousetrap.

 

   UINT uResult = SetTimer(hWnd,             // handle to main window

        IDT_TIMER,                   // timer identifier

        1000,                           // 1-second interval

       (TIMERPROC) NULL);               // no timer callback

 

  if (uResult == 0)

  {

       MessageBox(hWnd, "No timer is available.", "Error", MB_OK);

  }

  ShowWindow(hWnd, nCmdShow);

  UpdateWindow(hWnd);

  return TRUE;

}

//

//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)

//

//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.

//

//  WM_COMMAND - обработка меню приложения

//  WM_PAINT -Закрасить главное окно

//  WM_DESTROY  - ввести сообщение о выходе и вернуться.

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

 int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc,hmdc;

 switch (message)

 {

 case WM_COMMAND:

 wmId    = LOWORD(wParam);

 wmEvent = HIWORD(wParam);

 // Разобрать выбор в меню:

 switch (wmId)

 {

 case IDM_ABOUT:

  DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

  break;

 case IDM_START_EXE:

  StartExe(hWnd);

  break;

 case IDM_EXIT:

  // !!!! TODO - добавить код убивания процессов

  DestroyWindow(hWnd);

  break;

 default:

  return DefWindowProc(hWnd, message, wParam, lParam);

 }

 break;

 case WM_TIMER: {

 for (int i=0; i<current_process; i++) {

  if (IsProcessStillRunning(processes[i])) processes[i].nCount++;

 }

 RECT rect;

 GetClientRect(hWnd, &rect);

 InvalidateRect(hWnd, &rect, true);

 break;

      }

 case WM_RBUTTONDOWN:

 {

  if(button_check==0)

  {

   button_check=1;

  }

  else

   button_check=0;

  break;

 }

 case WM_PAINT: {

 if (button_check==1)

 {

 hdc = BeginPaint(hWnd, &ps);

 // TODO: добавьте любой код отрисовки...

    // тут пробежаться циклом по processes и вывести информацию

 hPen = CreatePen(0, 2, RGB(0,0,0xFF));

 SelectObject(hdc, hPen);

 TCHAR process_str[1024];

 TCHAR temp[ ] = "Name: %s  Process ID: %d    Thread ID: %d  Live time: %d sec, Active: %s";

 for (int i=0; i<current_process; i++) {

  wsprintf(process_str, temp, processes[i].process_name, processes[i].pi.dwProcessId, processes[i].pi.dwThreadId, processes[i].nCount,

   IsProcessStillRunning(processes[i]) ? "ACTIVE" : "STOPPED");

  int len=0; while (process_str[len]!=0) len++;

  TextOut(hdc, 400, 400 + 25* i, process_str, len );

 }

 ValidateRect(hWnd,NULL);

 EndPaint(hWnd, &ps);

 break;

 }

 else

  hdc = BeginPaint(hWnd, &ps);

 // TODO: добавьте любой код отрисовки...

    // тут пробежаться циклом по processes и вывести информацию

 hPen = CreatePen(0, 2, RGB(0,0,0xFF));

 SelectObject(hdc, hPen);

 TCHAR process_str[1024];

 TCHAR temp[ ] = "Name: %s  Active: %s";

 for (int i=0; i<current_process; i++) {

  wsprintf(process_str, temp, processes[i].process_name,

   IsProcessStillRunning(processes[i]) ? "ACTIVE" : "STOPPED");

  int len=0; while (process_str[len]!=0) len++;

  TextOut(hdc, 400, 400 + 25* i, process_str, len );

 }

 ValidateRect(hWnd,NULL);

 EndPaint(hWnd, &ps);

 break;

 }

 

 case WM_DESTROY:

 KillTimer(hWnd, IDT_TIMER);

 for (int i=0; i<current_process; i++)

 {

  if (IsProcessStillRunning(processes[i])) TerminateProcess(processes[i].pi.hProcess, 0);

 }

 PostQuitMessage(0);

 break;

 default:

 return DefWindowProc(hWnd, message, wParam, lParam);

}

 return 0;

}

bool IsProcessStillRunning(PROCESS p)

{

 DWORD code;

 return GetExitCodeProcess(p.pi.hProcess, &code) !=0 && code == STILL_ACTIVE;

}

// Обработчик сообщений для окна "О программе".

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

 UNREFERENCED_PARAMETER(lParam);

 switch (message)

{

 case WM_INITDIALOG:

 return (INT_PTR)TRUE;

 case WM_COMMAND:

 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

 {

  EndDialog(hDlg, LOWORD(wParam));

  return (INT_PTR)TRUE;

 }

 break;

}

 return (INT_PTR)FALSE;

}

void StartExe(HWND hWnd)

{

 if (current_process >= MAX_PROCESSES) {

 MessageBox(hWnd, "Maximum number of processes is being running.", "Error", MB_OK);

 return;

}

   ZeroMemory(&of, sizeof(of));

ZeroMemory(&filename, sizeof(filename));

   of.lStructSize=OPENFILENAME_SIZE_VERSION_400A; /*размер структуры OPENFILENAME*/

   of.hwndOwner=NULL ;                        /*дескриптор родительского окна*/

   of.hInstance=hInst;                         /*дескриптор экземпляра программы*/

   of.lpstrFilter=filters;/*фильтр файлов (тип)*/

   of.lpstrCustomFilter=NULL;              /*еще один фильтр: нам не надо*/

   of.nMaxCustFilter=0;                    /*нам не надо*/

   of.nFilterIndex=1;                      /*количество заданных нами фильтров*/

   of.lpstrFile=filename;                  /*адрес буфера под имя файла*/

   of.nMaxFile=MAX_PATH;                   /*размер буфера под имя файла*/

   of.lpstrFileTitle=NULL;                 /*буфер под рекомендуемый заголовок: нам не надо*/

   of.nMaxFileTitle=0;                     /*нам не надо*/

   of.lpstrInitialDir=NULL;                /*стартовый каталог: текущий*/

   of.Flags=OFN_PATHMUSTEXIST; /*разные флаги*/

   if (GetOpenFileName(&of)) {

      // действия в случае успешного выбора файла /

 CreateProcess(NULL, of.lpstrFile, NULL, NULL, NULL, NULL, NULL, NULL, &(processes[current_process].si), &(processes[current_process].pi));

 strcpy (processes[current_process].process_name,of.lpstrFile);

 processes[current_process].nCount=0;

 current_process++;

   }

}


 

А также другие работы, которые могут Вас заинтересовать

17079. Побудова багаточлена Лагранжа. Складання алгоритму 216 KB
  Лабороторна робота №3 Тема. Побудова багаточлена Лагранжа. Складання алгоритму. Мета. Навчитися будувати багаточлен Лагранжа скласти алгоритм. Обладнання. Лист формату А4 ручка ПК програмне забезпечення С. Хід роботи Правила ТБ Теоретичні відомо
17080. Інтерполяційні формули через розділені різниці 54.5 KB
  Лабороторна робота №5 Тема. Інтерполяційні формули через розділені різниці Мета.Навчитися знаходити значення функції при даному значенні аргумента використовуючи інтерполяційні формули Н’ютона через розділені різниці Обладнання. Лист формату А4 ручка про
17081. Формули Н’ютона через кінцеві різниці 50 KB
  Лабороторна робота №6 Тема. Формули Н’ютона через кінцеві різниці Мета. Навчитися обчислити значення функції при даному значенні аргумента використовуючи формули Н’ютона через кінцеві різниці. Обладнання. Лист формату А4 ручка олівець програмне забезпечення С...
17082. Знаходження інтегралу за формулами трапецій 64 KB
  Лабораторна робота № 10 Тема. Знаходження інтегралу за формулами трапецій. Мета. навчитися знаходити значення інтегралу за формулами трапецій. Скласти програму. Устаткування: папір А4 ручка ПК програмне забезпечення С. Хід роботи 1. Правили техніки безпеки. ...
17083. Метод Крилова побудови власного багаточлена матриці 66 KB
  Лабораторна робота №18 Тема. Метод Крилова побудови власного багаточлена матриці. Мета. Навчитися знаходити власний багаточлен матриці методом Крилова. Устаткування: лист формату А4 ручка програмне забезпечення Borland C Хід роботи Правила техніки безпеки ...
17084. Знаходження власних чисел і векторів матриці по методу Крилова 57.5 KB
  Лабораторна робота №19 Тема. Знаходження власних чисел і векторів матриці по методу Крилова. Мета: навчитися знаходити власні числа і вектори матриці по методу Крилова. Устаткування: лист формату А4 ручка С . Хід роботи Правила техніки безпеки Теоретичн
17085. Знаходження розв’язку системи лінійних рівнянь методом ітерацій, складання алгоритму 78 KB
  Лабораторна робота №2122 Тема. Знаходження розв’язку системи лінійних рівнянь методом ітерацій складання алгоритму. Мета. Навчитися вирішувати систему лінійних рівнянь методом ітерацій с заданою точністю скласти алгоритм. Устаткування: папір формату А4 ПК С Х...
17086. Знаходження розв’язку системи лінійних рівнянь методом Зейделя 64.5 KB
  Лабораторна робота №23 Тема. Знаходження розв’язку системи лінійних рівнянь методом Зейделя Мета. Навчитися вирішувати систему лінійних рівнянь методом Зейделя с заданою точністю; скласти програму. Устаткування: папір формату А4 ПК С Хід роботи Правила те...
17087. Метод Рунге-Кутта вирішення задачі Коші. Складання програми 156 KB
  Лабораторна робота №27 Тема. Метод РунгеКутта вирішення задачі Коші. Складання програми. Мета. Навчитися вирішувати задачу Коші методом РунгеКутта; скласти програму. Устаткування: папір формату А4 ПК програмне забезпечення Borland С. Хід роботи Вирішити задачу