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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    68,06 Кб
  • Опубликовано:
    2015-05-14
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

РЕФЕРАТ

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

Варіант

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

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

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

Зміст

Вступ

. Теоретична частина

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

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

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

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

. Практична частина

.1 Постановка задачі

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

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

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

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

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

Висновок

Список використаних джерел

Додаток А

Вступ

API спроектований для використання в мові Сі для написання прикладних програм, призначених для роботи під управлінням операційної системи MS 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 Основи розробки додатків 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.

.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, дескриптор) та ін.

.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, як і в принципі для будь-якої іншої функції, користувач може вибирати на свій розсуд.

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

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

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

         Створити головне вікно і показати його на екрані. Породжені вікна також необхідно створити, хоча це можна зробити і пізніше, і не обов'язково у функції WinMain().

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

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

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

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

При заповненні структурної змінної типу 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 з повного набору:OVERLAPPEDWINDOW & -WS MAXIMIZEBOX

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

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

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

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

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

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

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

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

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

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

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

. Практична частина

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

.1 Постановка завдання

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

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

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

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

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

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

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

Синтаксис:

char filename[MAX_PATH]="";of;.lStructSize=OPENFILENAME_SIZE_VERSION_400A;.hwndOwner=hw;.hInstance=h;.lpstrFilter="All files (*.*)\0*.*\0";.lpstrCustomFilter=NULL;.nMaxCustFilter=0;.nFilterIndex=1;.lpstrFile=filename;.nMaxFile=MAX_PATH;.lpstrFileTitle=NULL;.nMaxFileTitle=0;.lpstrInitialDir=NULL; of.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;(GetOpenFileName(&of)) {}

filename[MAX_PATH]

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

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

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

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

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

of.nFilterIndex

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

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

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

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

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

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

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

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

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

CreateProcess(lpApplicationName, // ім’я виконуючого модуляlpCommandLine, // командна строчка_ATTRIBUTES lpProcessAttributes,// захист процесу_ATTRIBUTES lpThreadAttributes, // захист потокаbInheritHandles, // ознак наслідування дескрипторуdwCreationFlags, // прапорці створення процесуlpEnvironment, // блок нового середовищаlpCurrentDirectory, // поточний каталогlpStartUpInfo, // головне вікно_INFORMATION lpProcessInformation // інформація о процесі

);

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

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

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

(  WPARAM wParam  LPARAM lParam;

)

wParam

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

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

Синтаксис WM_PAINT:

CALLBACK WindowProc(hwnd, // дескриптор вікнаuMsg, // WM_PAINTwParam,lParam

);

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

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

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

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

Синтаксис WM_RBUTTONDOWN

_RBUTTONDOWNwParamlParam;

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

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

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

_DESTROY

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

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

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

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

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

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

Висновки

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

Були здобуті навички роботи з файлами, процесами та обробка даних цих процесів.

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

Список використаних джерел

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

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

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

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

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

. Верма Р.Д. Справочник по функциям 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 1000button_check=0;

// Глобальные переменные:hInst;// текущий экземплярszTitle[MAX_LOADSTRING];// Текст строки заголовкаszWindowClass[MAX_LOADSTRING];// имя класса главного окнаfilename[MAX_PATH]; /*буфер под имя файла*/filters[] = "Program files (.)\0*.exe\0";of;hPen;struct {si;_INFORMATION pi;process_name[MAX_PATH];UINT nCount;

} PROCESS;processes[MAX_PROCESSES];current_process;

// Отправить объявления функций, включенных в этот модуль кода:(HINSTANCE hInstance);(HINSTANCE, int);CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);StartExe(HWND);IsProcessStillRunning(PROCESS p);APIENTRY _tWinMain(HINSTANCE hInstance,hPrevInstance,lpCmdLine,nCmdShow)

{_PARAMETER(hPrevInstance);_PARAMETER(lpCmdLine);

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

// Инициализация глобальных строк(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);(hInstance, IDC_KURS, szWindowClass, MAX_LOADSTRING);(hInstance);

// Выполнить инициализацию приложения:(!InitInstance (hInstance, nCmdShow))

{FALSE;

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

// Цикл основного сообщения:(GetMessage(&msg, NULL, 0, 0))

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

{(&msg);(&msg);

}

}(int) msg.wParam;

}

//

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

//

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

//

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

//

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

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

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

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

// с ними.

{wcex;.cbSize = sizeof(WNDCLASSEX);.style= CS_HREDRAW | CS_VREDRAW;.lpfnWndProc= WndProc;.cbClsExtra= 0;.cbWndExtra= 0;.hInstance= hInstance;.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_KURS));.hCursor= LoadCursor(NULL, IDC_ARROW);.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);.lpszMenuName= MAKEINTRESOURCE(IDC_KURS);.lpszClassName= szWindowClass;.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));RegisterClassEx(&wcex);

}

//

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

//

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

//

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

//

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

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

//InitInstance(HINSTANCE hInstance, int nCmdShow)

{hWnd;= hInstance; // Сохранить дескриптор экземпляра в глобальной переменной= CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);(!hWnd)

{FALSE;

}

// Set the timer for the mousetrap.uResult = SetTimer(hWnd, // handle to main window_TIMER, // timer identifier

, // 1-second interval

(TIMERPROC) NULL); // no timer callback(uResult == 0)

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

}(hWnd, nCmdShow);(hWnd);TRUE;

}

//

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

//

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

//

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

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

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

//

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

{wmId, wmEvent;ps;hdc,hmdc;(message)

{WM_COMMAND:= LOWORD(wParam);= HIWORD(wParam);

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

{IDM_ABOUT:(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);;IDM_START_EXE:(hWnd);;IDM_EXIT:

// !!!! TODO - добавить код убивания процессов(hWnd);;:DefWindowProc(hWnd, message, wParam, lParam);

};WM_TIMER: {(int i=0; i<current_process; i++) {(IsProcessStillRunning(processes[i])) processes[i].nCount++;

}rect;(hWnd, &rect);(hWnd, &rect, true);;

}WM_RBUTTONDOWN:

{(button_check==0)

{_check=1;

}_check=0;;

}WM_PAINT: {(button_check==1)

{= BeginPaint(hWnd, &ps);

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

// тут пробежаться циклом по processes и вывести информацию= CreatePen(0, 2, RGB(0,0,0xFF));(hdc, hPen);process_str[1024];temp[ ] = "Name: %s Process ID: %d Thread ID: %d Live time: %d sec, Active: %s";(int i=0; i<current_process; i++) {(process_str, temp, processes[i].process_name, processes[i].pi.dwProcessId, processes[i].pi.dwThreadId, processes[i].nCount,(processes[i]) ? "ACTIVE" : "STOPPED");len=0; while (process_str[len]!=0) len++;(hdc, 400, 400 + 25* i, process_str, len );

}(hWnd,NULL);(hWnd, &ps);;

}= BeginPaint(hWnd, &ps);

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

// тут пробежаться циклом по processes и вывести информацию= CreatePen(0, 2, RGB(0,0,0xFF));(hdc, hPen);process_str[1024];temp[ ] = "Name: %s Active: %s";(int i=0; i<current_process; i++) {(process_str, temp, processes[i].process_name,(processes[i]) ? "ACTIVE" : "STOPPED");len=0; while (process_str[len]!=0) len++;(hdc, 400, 400 + 25* i, process_str, len );

}(hWnd,NULL);(hWnd, &ps);;

}WM_DESTROY:(hWnd, IDT_TIMER);(int i=0; i<current_process; i++)

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

}(0);;:DefWindowProc(hWnd, message, wParam, lParam);

}0;

}IsProcessStillRunning(PROCESS p)

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

}

// Обработчик сообщений для окна "О программе"._PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{_PARAMETER(lParam);(message)

{WM_INITDIALOG:(INT_PTR)TRUE;WM_COMMAND:(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{(hDlg, LOWORD(wParam));(INT_PTR)TRUE;

};

}(INT_PTR)FALSE;

}StartExe(HWND hWnd)

{(current_process >= MAX_PROCESSES) {(hWnd, "Maximum number of processes is being running.", "Error", MB_OK);;

}(&of, sizeof(of));(&filename, sizeof(filename));.lStructSize=OPENFILENAME_SIZE_VERSION_400A; /*размер структуры OPENFILENAME*/.hwndOwner=NULL ; /*дескриптор родительского окна*/.hInstance=hInst; /*дескриптор экземпляра программы*/.lpstrFilter=filters;/*фильтр файлов (тип)*/.lpstrCustomFilter=NULL; /*еще один фильтр: нам не надо*/.nMaxCustFilter=0; /*нам не надо*/.nFilterIndex=1; /*количество заданных нами фильтров*/.lpstrFile=filename; /*адрес буфера под имя файла*/.nMaxFile=MAX_PATH; /*размер буфера под имя файла*/.lpstrFileTitle=NULL; /*буфер под рекомендуемый заголовок: нам не надо*/.nMaxFileTitle=0; /*нам не надо*/.lpstrInitialDir=NULL; /*стартовый каталог: текущий*/.Flags=OFN_PATHMUSTEXIST; /*разные флаги*/(GetOpenFileName(&of)) {

// действия в случае успешного выбора файла /(NULL, of.lpstrFile, NULL, NULL, NULL, NULL, NULL, NULL, &(processes[current_process].si), &(processes[current_process].pi));(processes[current_process].process_name,of.lpstrFile);[current_process].nCount=0;_process++;

}

}

Похожие работы на - Створення програми, яка дозволяє запускати процеси, використовуючи для цього вибрані на диску файли

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!