Отримання інформації про конфігурацію комп'ютера.

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Інформаційних систем та мереж (ІСМ)

Інформація про роботу

Рік:
2009
Тип роботи:
Курсова робота
Предмет:
Системне програмування та операційні системи
Група:
КН-29

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет “Львівська політехніка” Кафедра “Інформаційні системи та мережі” К У Р С О В А Р О Б О Т А з дисципліни “Системне програмування та операційні системи” на тему: “ Отримання інформації про конфігурацію комп'ютера ”  ЛЬВІВ 2009 Структура завдання на курсову роботу З А В Д А Н Н Я на курсову роботу з дисципліни "Системне програмування та операційні системи" студенту групи КН-29 Тема: “ Отримання інформації про конфігурацію комп'ютера ” Завдання: Отримання інформації про конфігурацію комп'ютера ЗМІСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИКОНАННЯ 1. Провести огляд літературних джерел по заданій темі для аналізу задачі. 27.02  2. Розробити алгоритм розв'язування задачі. 27.03  3. Написати програму на мові С/C++, Assembler. Вимоги до програми: 1) програма повинна бути реалізована на мові С/С++, Assembler; 2) програма повинна мати інтерфейс для вибору режимів її роботи 3) програма повинна працювати у вікні MSDOS під керуванням операційної системи Windows; 4) програма повинна мати систему допомоги та інтерфейс у вигляді вікон та меню для вибору режимів роботи програми; 5) інші вимоги. 25.04  4. Підготувати вхідні дані для контрольного прикладу. 10.05   5. Реалізувати та відлагодити програму на вказаних мовах програмування.   6. Оформити записку до розрахункової роботи згідно вимог Міжнародних стандартів, дотримуючись такого змісту: • титульна сторінка • завдання для курсової роботи; • зміст; • вступ; • методи та засоби розв’язання задачі; • алгоритм розв'язування задачі; • опис програмної реалізації; • інструкція користувачеві; • контрольний приклад та аналіз результатів комп’ютерної реалізації програми; • висновки; • література; • додатки. 28.05   ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ____________ Керівник роботи: ____________ /Кравець П.О./ З М І С Т Вступ……………………………………………………………………………………... 4 1. Формулювання задачі……………………………………...………………………... 5 2.Методи та засоби розв’язування задачі……………………………………………… 6 2.1. Клас вікон…………………………………......................................................6 2.2. Створення вікон………....................................................................................8 2.3 Головна функція додатка..……………..………………………………...……9 2.4 Створення списку………………………………………………………………9 2.5 Вивід у вікно....................................................................................................10 2.6 Меню..............................................................................................................10 2.7 Створення меню............................................................................................11 2.8 Вставка елементів в меню............................................................................12 3. Алгоритм розв'язування задачі……………..…………………………...................... 13 4. Програма та її опис…………………………………………………………………… 15 4.1 Призначення програми……………………………………………………… 15 4.2. Мови програмування, на яких написана програма……………………….. 15 4.3. Програмні засоби, необхідні для реалізації програми……………………. 15 4.4. Технічні засоби, необхідні для реалізації програми………………... ……..15 5. Інструкція користувачеві……………………………………………………………. 17 6. Контрольний приклад та аналіз результатів комп'ютерної реалізації програми… 18 Висновки……………………………………………………………………………........ 20 Література……………………………………………………………………………...... 21 Додатки………………………………………………………………………………........22 В С Т У П Виконання даної курсової роботи є закріплення теоретичних знань та проктичних навичок програмування, набутих при вивченні дисципліни “Основи програмування”. В ході виконання курсової роботи студенти повинні навчитися самостійно працювати з літературою, розробляти алгоритми та програми на мові програмування Turbo С. Cі — універсальна, процедурна, імперативна мова програмування, розроблена у 1972 році Денісом Рітчі у Bell Telephone Laboratories для використання з операційною системою UNIX. З тих пір її версії з'явилися для багатьох інших операційних систем, і наразі Сі є однією з найбільш поширених мов програмування. Cі також здійснив великий вплив на інші мови програмування, особливо на C++, котра спочатку проектувалася, як розширення для Сі. Найчастіше використовується для написання системного програмного забезпечення, хоча, досить часто на ній пишуть і прикладне програмне забезпечення. С — мінімалістична мова програмування. Серед її головних цілей: можливість прямолінійної реалізації компіляції, використовуючи відносно простий компілятор, забезпечити низькорівневий доступ до оперативної пам'яті, формувати лише декілька інструкцій машинної мови для кожного елементу мови, і не вимагати обширної динамічної підтримки. У резальтаті, код С придатний для більшості системного програмного забезпечення, котре традиційно писалося на аcемблері. Незважаючи на її низькорівневі можливості, мова проектувалася для машинно-незалежного програмування. Сумісна зі стандартами та машинно-незалежно написана програма на С може легко компілюватися на великій кількості апаратних платформ та операційних систем з мінімальними змінами. Мова стала доступною для великої кількості платформ, від вбудованих мікроконтроллерів до суперкомп'ютерів. 1. Формулювання задачі Проектування інтерфейсу програм у Windows. програма повинна бути реалізована на мові С/С++, Assembler; програма повинна працювати під керуванням операційної системи Windows; програма повинна мати інтерфейс; керування режимами роботи програми виконати за допомогою клавіатури та миші. Програма повинна виводити інформацію про компютер, тобто процесор, відеоадаптер, оперативну пам'ять, USB контролери комп’ютера. 2. Методи та засоби розв’язання задачі Програми для Windows називають додатками. Користувач з додатком взаємодіє через вікна наступних видів: Вікно додатка. Воно організовує роботу, з'являється першим при запуску і закривається разом з припиненням роботи додатка. MDI-вікна. Вони служать для одночасної обробки декількох документів. Вікно допомоги. Воно більшою мірою працює під управлінням операційної системи, чим під управлінням додатка. Діалогове вікно. Воно забезпечує оперативний обмін даними між користувачем і додатком. Для розробника вікно є сукупністю великої кількості елементів, що функціонують під управлінням додатка і операційної системи. З погляду мови програмування, вікна - це об'єкти над якими виконують дії. Об'єкт належить опреділеному класу (типові), який описує безліч даних (параметрів стану вікна) і метод (функцію) зміни цих даних. Головне вікно на має подвійні рамки, що обрамували, заголовок, різні кнопки, смугу меню, панель інструментів з кнопками, смуги перегляду, рядок стану і ін. Ці елементи також є вікнами, мають свої дані і метод їх зміни, тобто належать до класів вікон. 2.1 Клас вікон Для створення вікна операційній системі вказують, до якого класу воно належить. Якщо до моменту створення вікна операційною системою відомий клас створюваного вікна (наприклад, це визначений в системі або зареєстрований поточним або іншим застосуванням клас), то можна скористатися ім'ям цього класу. Інакше потрібно створити новий клас (описати функцію вікна і набір використовуваних ресурсів) і зареєструвати його. Опис використовуваних класом вікон pесурсів Набір використовуваних ресурсів класу задають в структурі типа WNDCLASS. Ця структура описана таким чином: typedef struct { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hlnstance; HICON hlcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; } WNDCLASS; Наприклад, якщо описана структура цього типа: WNDCLASS wc; то привласнюють певні значення її полям. Призначення полів цієї структури: style набуває значень. Наприклад: wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; - lpfnWndProc вказує на функцію вікна. Вона розглядається нижче. - cbClsExtra дорівнює кількості додаткових байт класу. - cbWndExtra дорівнює кількості додаткових байт вікна цього класу. - hInstance вказує на дескриптор поточного застосування. - hIcon вказує на ймення піктограма (ікони), в яку перетворюється вікно при мінімізації. Ресурс ікони завантажують функцією LoadIcon: HICON Loadlcon( HINSTANCE hlnst, LPCTSTR lplconName); Параметр lplconName вказує на рядок з ім'ям завантажуваної ікони, а hInst - дескриптор додатка, чий виконуваний код містить завантажуваний ресурс. Для завантаження стандартної ікони hInst прирівнюють NULL, а як lplconName задають одне із значень. Наприклад, наступний оператор встановлює стандартну піктограму вікна додатка: wc.hlcon = Loadlcon( NULL, IDI_APPLICAT!ON ); В разі аварійного завершення функція повертає NULL і при згортанні вікон цього класу операційна система як іконки використовує логотип Windows. - hCursor задає вид курсора миші при його проходженні над вікном. Ресурс курсора завантажують функцією LoadCursor: HCURSOR LoadCursor( HINSTANCE hInst, LPCTSTR lpCursorName); Параметр lpCursorName вказує на рядок з ім'ям завантажуваного ресурсу, а hInst - дескриптор додатка, чий виконуваний код містить завантажуваний ресурс. Для завантаження стандартного курсора hInst прирівнюють NULL, а як lpCursorName задають одне із значень. Наприклад, наступного оператора задає курсор у вигляді стандартной стрілки: wc.hCursor = LoadCursor(NULL, IDC_ARROW); В разі аварійного завершення функція повертає NULL і вікно запозичуватиме курсор передування по руху миші вікна. Функції LoadIcon і LoadCursor завантажують ресурс іконки або курсора, тільки якщо ресурс не був завантажений; інакше вибирають дескриптор загруженного ресурсу. - hbrBackground задає дескриптор грона зафарбування фону вікна. В якості кисті можна використовувати "чисті" кольори або піктограму. Частіше використовують значення системного кольору. Кольори перетворять в типа HBRUSH. Наприклад, слідуючий оператор встановлює системний колір зафарбування фону: wc.hbrBackground = (HBRUSH)( COLOR_WINDOW+1); Система сама видаляє гроно фону при звільненні класу. Якщо вказати NULL, то додаток само повинен фарбувати фон вікон. Для оприділення необхідності зафарбування додаток обробляє повідомлення WM_ERASEBKGND або перевіряє поле fErase структури PAINTSTRUCT, заповненою функцією BeginPaint. - lpszMenuName вказує на ресурс головного меню вікон цього класа. Якщо задати NULL, вікна цього класу не мають заданого по умовчанню меню. Наприклад: wc.lpszMenuName = (LPCTSTR)NULL; - 1pszClassName вказує на текстовий рядок, що містить ім'я реєстрованого класу вікон, наприклад: wc.lpszClassName = szName; Для реєстрації класу вікон зручно використовувати функцію слідуючого вигляду: int RegClass( WNDPROC Proc, LPCTSTR szName){ WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = wc.cbWndExtra = 0; wc.lpfnWndProc = Proc; wc.hlnstance = hlnstance; wc.hlcon = Loadlcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = (LPCTSTR)NULL; wc.lpszClassName = szName; return RegisterClass(&wc); } Формальними параметрами цієї функції є покажчики на функцію вікна і рядок з ім'ям класу. Ім'я, список формальних параметрів і тип повернення функції можуть бути будь-якими іншими. Головне, щоб додатку після реєстрації були доступні ім'я зареєстрованого класу, а операційній системі - функція вікна цього класу. 2.2 Створення вікон Для створення вікна викликають функцію CreateWindow. Вона створює вікно, що перекривається, тимчасове або дочірнє, і встановлює початкове значення деяких його параметрів. Призначення аргументів виклику цієї функції: - lpClassName вказує на зареєстрований функцією RegisterClass або визначеного операційною системою класу. - dwStyle задає стиль вікна. Стиль вікон окремо розглянемо нижче. x — координата лівого краю вікна в пікселях. Для тимчасових вікон x відлічують від лівого краю екрану робочої зони батьківського вікна. Якщо для перекриваючого вікна із стилем WSJVISIBLE як x задати константу CW_USEDEFAULT, Windows встановлює не обов’язково нульову позицію за умовчанням для лівого верхнього кута вікна і ігнорує координату біля верхнього краю вікна. Для тимчасового дочірнього вікна така позиція за умовчанням рівна (0, 0). - nWidth - ширина вікна в пікселях. Для вікон можна, що перекриваються, задати рівною CW_USEDEFAULT. В цьому випадку система встановлює ненульові значення ширини і висоти за умовчанням і ігнорує задану висоту nHeight вікна. Ширина і висота тимчасового і дочірнього вікна за умовчанням дорівнюють нулю. - hWndParent може вказувати тільки на ініційоване вікно. Дескриптор вікна-батька обов'язково вказують при створенні дочірнього вікна. Дескриптор вікна-власника для тимчасового вікна вказувати необов'язково. - hMenu - дескриптор меню або ідентифікатор створюваного дочірнього вікна. Меню вікна, що перекривається або тимчасового, можна задати трьома способами: 1) у класі вікон вказують ім'я меню, і всі вікна цього класу можуть користуватися цим меню; 2) ім'я меню вказують як аргумент функції CreateWindow, і потрібне вікно користуватиметься цим меню, ігноруючи меню класу; 30 меню створюють в процесі або після створення вікна. У першому і третьому випадках аргумент hMenu рівний NULL. Якщо створюється дочірнє вікно, то аргументом hMenu задають Ідентифікатор цього вікна (цілочисельну константу). Перед створенням вікна функція CreateWindow посилає код повідомлення WM_CREATE функції створюваного вікна. Вона потім обробляє повернуте функцією вікна значення і створює вікно, якщо це значення дорівнює 0, або не створює вікна, якщо значення рівне -1. Відповідно функція CreateWindow повертає дескриптор створеного вікна або NULL. 2.3 Головна функція додатка Додатки завжди описують функцію з ім'ям WinMain. Вона отримує управління при запуску додатка, виконує властиві звичайним функціям дії, реєструє класи вікон, створює вікна, опитує чергу повідомлень і розподіляє свої повідомлення. Приклад опису функції WinMain: int WINAPI WinMain( HINSTANCE hlnstance HINSTANCE hPrevlnstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; HWND hwnd; if (!RegClass(WndProc, szClassName)) return FALSE; hwnd = CreateWindow(szClassName, "Приклад Г WS_OVERLAPPEDWINDOW CW_USEDEFAULT, CW USEDEFAULT CW_USEDEFAULT, CW_USEDEFAULT 0, 0, hlnstance,NULL); if (!hwnd) return FALSE; ShowWindow( hwnd, SW_SHOWMAXIMIZED); UpdateWindow(hwnd); while (GetMessage(&msg, 0,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } Ім'я, тип повернення і список формальних параметрів функції опреділеними вимогами Windows API. Модифікатор WINAPI вказує на те, що функція при отриманні аргументів сама повинна виправити порядок розташування аргументів в стеку. Параметр hInstance від операційної системи отримує дескриптор поточного екземпляра додатка. Параметр hPrevlnstance в 16-разрядних застосуваннях вказує на активний попередній екземпляр додатка або NULL. У додатках Win32 він завжди рівний NULL і по ньому неможливо дізнатися про існування інших активних екземплярів цього застосування. Параметр lpszCmdLine вказує на рядок з аргументами командного рядка запуску додатка. При звичайному запуску цей параметр рівний NULL. Параметр nCmdShow передає додатку спосіб початкового відображення вікна. У тілі функції WinMain описані змінні msg і hwnd. Змінна msg призначена для тимчасового зберігання повідомлень при їх отриманні і розподілі. Змінна hwnd зберігає дескриптор створеного вікна. 2.4 Створення списку Списки рядків створюють на базі класу "listbox". Рядки в списку нумерує операційна система, і номер першого рядка дорівнює 0. Списки можуть бути одноколоночні і багатоколоночні, з вертикальною (для одноколоночних списків) і горизонтальною (для багатоколоночних списков) смугою перегляду. При створенні списку першим аргументом функції CreateWindow є покажчик на рядок "listbox", а третій аргумент задають за допомогою таблиці. Наприклад: #define ID_LIST 111 hListBox = CreateWindow("listbox", NULL WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_WANTKEYBOARDINPUT 30, 30, 200,100, hwnd, (HMENU) ID_LIST, hlnst, NULL); Другий аргумент функції має бути вказаний як NULL. Додатково до стилів вікна WS_CHILD і WS_VISIBLE вказують стилі списка, імена яких мають префікс LBS_. 2.5 Вивід у вікно Вивід у вікна володіє лавою особливостей. Не можна користуватися функціями виведення бібліотеки компілятора, оскільки вони пристосовані для виводу в одне і єдине вікно. В операційній системі Windows додатка виводять одночасно в різні вікна. Система сама вирішує всі проблеми, пов'язані з можливим перекриттям або переміщенням цих вікон. З цим пов'язане те, що у вікно прагнуть виводити в одному місці додатки - при обробці повідомлення WM_PAINT. Додаток описують так, щоб під час вступу повідомлення WM_PAINT функція вікна могла перемальовувати все вікно або будь-яку його задану частину. Інтерфейс графічних пристроїв (Graphics Device Interface - GDI) системи відкриває доступ до великої кількості функцій вивода. Додатки, звертаючись до функцій GDI, працюють не з фізичними пристроями виводу, а з логічними. Тобто опис вибору функцій не залежить від фізичного способу відображення. GDI передає повідомлення про вивід драйверу пристрою виводу. Драйвер працює з фізичним пристроєм і при управлінні виведенням враховує його обмежені можливості і апаратні особливості. Завдяки цьому додатки здатні працювати з будь-яким пристроєм вивода, драйвер якого встановлений в системі. У цьому розділі розглядаються функції і параметри виводу у вікно на екрані відеомонітора. Но не всі фізичні пристрої виводу здатні підтримувати ті режими, в яких працює відеомонітор. Тому, описуючи послідовність операцій виводу, наприклад на принтер, слід враховувати можливості встановленого принтера. Параметри виводу встановлюють в контексті відображення з допомогою функцій GDI. Контекст відображення - це структура даних, яка містить характеристики пристрою виводу і покажчики на вибрані інструменти малювання. Функції GDI використовують тільки вибрані в контекст відображення параметри і інструменти малювання. Наприклад, для малювання лінії деякої товщини в контекст відображення застосування повинне вибрати перо цієї товщини. Дескриптор контексту відображення служить першим аргументом виклику всіх функцій, пов'язаних з виводом у вікно. 2.6 М е н ю Меню використовують для вибору команд і зміни режимів роботи додатка. Рядки меню відображають назву розділу меню або сенс пов'язаної з рядком команди. Якщо рядок пов'язаний з командою, при її виборі додаток отримує повідомлення WM_COMMAND і ідентифікатор цієї команди. Основним елементом меню, що відображується, є рядок або графічний об'єкт. Тут розглядаються тільки рядки. Вони в текстовому вигляді відображують назви розділів або команд меню, а також клавіш швидкого доступу. Рядок може бути відмічена галочкою або іншим чином. Такий рядок використовується як прапорець або перемикач, що змінює режим роботи додатка. Якщо при виборі рядка на екрані повинна з'явитися діалогова панель, до слова справа додають багатокрапку. Заблоковані рядки меню відображують сірим кольором. Будь-яке вікно, що перекривається або тимчасове, може мати меню. Головне меню знаходиться нижчим за заголовок вікна, і його рядки розташовані в одну або декілька ліній. При виборі рядка головного меню, як правило, активізується розділ меню. Розділом меню є тимчасове меню. Рядки тимчасового меню розташовані в один або декілька стовбчиків. Якщо тимчасове меню може з'являтися в будь-якому місці робочої області, то воно називається плаваючим. В деяких випадках зручніше застосовувати плаваюче меню. Вони "спливають" після клацання зазвичай правої клавіші миші, і місце "спливання" неважко зв'язати з координатами курсору миші. Тоді легко вибрати потрібний рядок меню. Крім того, по координатах курсору миші можна визначити об'єкт, по зображення якого було зроблено клацання, і задати залежний від цього об'єкту набір рядків меню. Якщо вікно має системне меню, то воно розташоване зліва від тексту заголовка вікна. За способом створення розрізняють статичне і динамічне меню. Статичне меню створюють до запуску і не змінюють в процесі роботи додатка. Динамічне меню створюють в процесі роботи додатка. Динамічне меню після створення можна змінювати або залишити незмінним. Робота з рядками статичних і динамічних меню нічим не відрізняється. Тут розглядуються способи створення тільки динамічних меню. 2.7 Створення меню Алгоритм створення меню в спільному випадку містить наступні кроки: Створення порожнього меню hMenu. Вставка елементу в меню hMenu. Крок 2 повторюваний стільки раз, скільки елементів містить меню hMenu. Цей алгоритм дозволяє створювати багаторівневе меню. Наприклад, елемент, що вставляється на 2-му кроці, може вказувати на вже створене тимчасове меню. Причому будь-який елемент останнього також може вказувати на тимчасове меню. Меню спочатку створюють тільки в пам'яті. Існують функції, котрі операційній системі вказують, яке меню створене, якому вікну воно належить і коли його відображувати. Розгленемо ці функції. Функція CreateMenu створює порожнє головне меню вікна: HMENU CreateMenu(VOID); В разі успішного виконання функція CreateMenu повертає дескриптор створеного головного меню, інакше - NULL. Функція CreatePopupMenu створює порожнє тимчасове меню: HMENU CreatePopupMenu(VOID); В разі успішного виконання функція CreatePopupMenu повертає дескриптор створеного тимчасового меню, інакше - NULL. Функція SetMenu підключає головне меню hMenu до вікна hwnd: BOOL SetMenu(HWND hwnd, HMENU hMenu); Вона видаляє попереднє меню, але не руйнує його. Якщо ж hMenu= = NULL, то тільки віддаляється головне меню. В разі успішного підключення функція повертає ненульове значення. Після змін в меню, незалежно від стану вікна hwnd, для перемальовування смуги меню потрібно викликати функцію DrawMenuBar: void WINAPI DrawMenuBar(HWND hwnd); Вона перемальовувала смугу меню вікна hwnd. Таким чином, алгоритм підключення головного меню до вікна і відображення смуги меню містить наступні кроки: Створення головного меню. Цей крок повністю збігається з алгоритмом створення меню. Підключення головного меню до вікна. Перемальовування смуги меню вікна. Після цього роботу з меню забезпечує операційна система. Додаток в створене меню може вставляти нові елементи або видаляти старі, а також може змінювати або спитає поточне становище будь-якого елементу. 2.8 Вставка елементів в меню Функція InsertMenuItem вставляє елемент в меню hMenu: BOOL insertMenultem(HMENU hMenu, UINT ultem BOOL ffiyPosition, LPMENUITEMINFO lpmii); Значення аргументу uItem залежить від значення fflyPosition. При fByPosition=FALSE значення uItem дорівнює ідентифікатору команди елементу, що вставляється, інакше - позиції того елементу в меню, перед яким потрібно вставити новий елемент. Якщо меню містить n елементи і потрібно вставити новий елемент останнім, то номер позиції прирівнюють n (n=0, 1, 2 . ..). Параметр lpmii вказує на структуру типа MENUITEMINFO, яка вже містить інформацію про елемент, що вставляється. В разі успішної вставки елементу функція повертає ненульове значення. 3. Алгоритм розв'язування задачі   4.Програма та її опис 4.1 Призначення програми Програма призначена для відображення конфігурації комп’ютера. Програма демонстративно може використовуватись у школах, інститутах при вивченні даного матеріалу. Мови програмування, на яких написана програма Програма написана на мові програмування С. Вибір даної мови зумовлений завданням проекту. Мова C була створена на початку 70-х рр. Денісом Рітчі, який працював в компанії Bell Telephone Laboratories. C була розроблена як мова для програмування операційної системи Unix. З того часу мова пройшла великий шлях розвитку, і на сьогоднішній день існує понад 17 різних компіляторів мови C. В лютому 1987 р. фірма Borland International заявила про створення компілятора Turbo C, який став одним з найкращих компіляторів того часу. Програмні засоби, необхідні для реалізації програми Для нормальної роботи програми необхідні самі мінімальні потреби: кольоровий монітор з підтримкою текстового режиму, при збереженні результатів на диску повинне бути вільне місце і диск не повинен бути захищений від запису; маніпулятор типу „миша” та клавіатура – для управління програмою; процесор від 100 Hz; оперативна пам’ять – від 64 К. Технічні засоби, необхідні для реалізації програми Нормальну роботу програми забезпечує операційна система Windows. Перед запуском програми в оперативну пам’ять повинен бути завантажений драйвер маніпулятора „миші” (інакше управління програмою за допомогою цього пристрою буде неможливим). Програма написана з використанням засобів структурованого та модульного програмування. Структурованому програмуванню відповідає розбиття програми на функції, модульному – розподіл цих функцій за призначенням на окремі групи, які формують різні файли включення. Програма була розроблена в інтегрованому середовищі розробки програм Dev C/C++. Дане середовище забезпечує засоби відлагодження програми: покрокове виконання програми, перегляд та модифікація значень змінних програми під час її виконання:  Для успішного написання програми її відлагодження повинно відбуватися покроково. Тобто після того, як ми написали якусь частину програми (це може бути підпрограма) ми виконуємо компіляцію, знаходимо помилки і виправляємо їх. Ми повинні пам’ятати, що ті помилки, які показує компілятор, не завжди стосуються саме тих частин на які він вказує. Причина може виявитися у попередніх операторах. Також ми повинні пам’ятати, що компілятор не показує логічних помилок, які ми створюємо. Тому перед запуском програми необхідно перевірити нашу програму на наявність таких помилок. У таких випадках нам допомагає попередньо розроблений алгоритм розв’язування задачі. Програма відкомпільована у виконавчий exe-файл, який може завантажуватися і виконуватися під управлінням будь-якої операційної системи Windows. Запуск програми (готового exe-файлу) можна здійснювати з командного рядка, або будь-яким іншим способом (запуск з командного файлу, запуск програми у Windows’і і т.д.). Використовуючи інтегроване середовище Dev C/C++ також можна запустити програму. Для цього потрібно відкрити файл програми, який містить функцію main і виконати команду меню Run – Run. Програма буде наново відкомпільована, тому повинні бути наявні всі файли включення та бібліотеки. Для нормальної роботи програми на комп’ютері повинен бути певний носій інформації (логічний диск, або віртуальний диск в оперативній пам’яті, дискета або CD), в якій зберігатиметься програма. Управління програмою реалізоване за допомогою миші та клавіатури і відповідає програмному інтерфейсу. Для нормальної роботи миші перед запуском програми в оперативну пам’ять повинен бути завантажений драйвер миші. 5. Інструкція користувачеві Для запуску у користувача повинна бути операційна система Windows.. Після запуску програми перед користувачем появляється основне вікно програми. Розглянемо основні елементи вікна та методи управління ними. 5.1 Головне вікно програми  Управління меню програми здійснюється за допомогою маніпулятора типу „миша” або клавіатурою. Призначення пунктів меню програми: Refresh – містить інформацію для отримання інформації про конфігурацію комп’ютера. Exit – вихід з програми. Контрольний приклад та аналіз результатів комп'ютерної реалізації програми  В И С Н О В О К У процесі виконання даної роботи було закріплено теоретичні знання по програмуванню інтерфейсу і програмних засобів які б давали нам інформацію про конфігурацію комп’ютера під Windows на мові С. Кінцевим результатом роботи над даним курсовим проектом є програма CompConfigMFC. Програма була розроблена в інтегрованому середовищі розробки програм Dev C/C++. Програма відкомпільована у виконавчий exe-файл, який може завантажуватися і виконуватися під управлінням будь-якої операційної системи Windows. Управління програмою реалізоване за допомогою миші та клавіатури і відповідає програмному інтерфейсу. Література Ганеев. - Проектирование интерфейса пользователя средствами Win32 API. Мархасин М.Л. и др. Руководство по архитектуре IBM PC AT.: - Мн.: ООО "Консул", 1992. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 1. Часть 1, 2, 3. Операционная система MS-DOS. M: ДИАЛОГ-МИФИ, 1991,1993. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 2. Аппаратное обеспечение IBM PC. Часть 1, 2. М: ДИАЛОГ-МИФИ, 1992. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 19, MS- DOS для программиста. Часть 2, М.: ДИАЛОГ-МИФИ, 1995. Деревянко А.С. Системное программирование. 2006. Деревянко А. С. Системное программное обеспечение персональньїх ЗВМ. Учебное пособие. - Харьков: ХГПУ, 1994. - 312с. Касаткин А.И. Профессиональное программирование на язьіке Си: системное программирование. - Мн.:ВШ, 1992. ДОДАТКИ – ТЕКСТ ПРОГРАМИ НА МОВІ С Додаток 1. wmiCompConfig.CPP #define _WIN32_DCOM #include <vector> #include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <comdef.h> #include <wbemidl.h> #pragma comment(lib, "comsuppw.lib") #pragma comment(lib, "wbemuuid.lib") #define SAFE_RELEASE(x) {if ((x) != NULL) { (x)->Release(); (x) = NULL; }} using namespace std; // ---------------------------------------- // Struct for working with WMI // (Windows Management Instrumentation). // Getting computer information. // Works through Microsoft Windows COM+. // ---------------------------------------- struct WMI { private: IWbemLocator* Locator; IWbemServices* Services; public: // ---------------------------------------- // Init WMI and connect // ---------------------------------------- WMI() { Locator = NULL; Services = NULL; try { // Init COM HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hr)) throw L"WMI: CoInitializeEx failed"; // Set security levels hr = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); if (FAILED(hr)) throw L"WMI: CoInitializeSecurity failed"; // Obtain the locator to WMI hr = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&Locator ); if (FAILED(hr)) throw L"WMI: CoCreateInstance IID_IWbemLocator failed"; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hr = Locator->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &Services // pointer to IWbemServices proxy ); if (FAILED(hr)) throw L"WMI: ConnectServer failed"; // Set security levels on the proxy hr = CoSetProxyBlanket( Services, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hr)) throw L"WMI: CoSetProxyBlanket failed"; } catch (const WCHAR* msg) { wprintf(L"WMI Error: %s\n", msg); } } // ---------------------------------------- // Destruct WMI // ---------------------------------------- ~WMI() { SAFE_RELEASE(Services); SAFE_RELEASE(Locator); CoUninitialize(); } // ---------------------------------------- // Get properties of objects of some class // ---------------------------------------- void GetProperties(WCHAR* className, vector<_bstr_t> propNames, vector<vector<_bstr_t> > &propValues) { // Use the IWbemServices pointer to make requests of WMI IEnumWbemClassObject* enumerator; HRESULT hr = Services->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM ") + bstr_t(className), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &enumerator ); if (FAILED(hr)) { //WMI: ExecQuery failed on className return; } // Prepare propValues.clear(); // Enumerate all class properties while (true) { // Get the next object IWbemClassObject* object; ULONG count = 0; HRESULT hr = enumerator->Next(WBEM_INFINITE, 1, &object, &count); if (FAILED(hr) || count == 0) break; // Get all object property names SAFEARRAY* names = NULL; hr = object->GetNames(NULL, WBEM_FLAG_ALWAYS, NULL, &names); if (FAILED(hr) || names->cDims == 0) break; // Init properties vector vector<_bstr_t> objProperties(propNames.size(),"UNKNOWN"); // Get each property // Handle multiple dims and bounds properly... for (ULONG i = 0; i < names->rgsabound[names->cDims - 1].cElements; i++) { BSTR name = ((BSTR*)names->pvData)[i]; // Find property position int iProperty; for (iProperty=0; iProperty<propNames.size(); iProperty++) { if (_bstr_t(propNames[iProperty])==_bstr_t(name)) { break; } } if (iProperty==propNames.size()) { continue; } // Get property VARIANT v; wostringstream osProperty; VariantInit(&v); hr = object->Get(name, 0, &v, 0, 0); if (SUCCEEDED(hr)) { // Handle all the VT_* types... switch (v.vt) { case VT_NULL: osProperty<<L"NULL"; break; case VT_UI4: osProperty<<v.ulVal; break; case VT_I4: osProperty<<v.lVal; break; case VT_BOOL: osProperty<<((v.boolVal) ? "TRUE" : "FALSE"); break; case VT_BSTR: osProperty<<v.bstrVal; break; default: osProperty<<"UNHANDLED VARIANT TYPE (%i"<<(int)v.vt<<")"; break; } objProperties[iProperty]=_bstr_t(osProperty.str().c_str()); VariantClear(&v); } else { osProperty<<L"Get failed on property "<<name; } } // Add object to result vector propValues.push_back(objProperties); // Cleanup SafeArrayDestroy(names); object->Release(); } // Cleanup enumerator->Release(); } }; // ------------------------------------------------------------------------------------------------ // References: // // WMI MSDN documentation: // http://msdn.microsoft.com/en-us/library/aa394582(VS.85).aspx // // Computer System Hardware Classes Win32 classes: // http://msdn.microsoft.com/en-us/library/aa389273(VS.85).aspx // // Using WMI MSDN example code: // http://msdn2.microsoft.com/en-us/library/aa390423.aspx // // Developing WMI Solutions: // http://books.google.com.ua/books?id=ZcmI8H2si48C // // Making WMI Queries In C++: // http://www.codeproject.com/KB/system/UsingWMI.aspx?display=Print // ------------------------------------------------------------------------------------------------ // ---------------------------------------- // Unit testing // ---------------------------------------- /*/ void main() { WMI wmi; vector<_bstr_t> propNames; vector<vector<_bstr_t> > propValues; wchar_t wstrClass[1024], wstrName[1024]; FILE *f = fopen("config.txt","rt"); while(fwscanf(f,L"%ls",wstrClass)!=EOF) { wcout<<"\n--> "<<wstrClass<<endl; while(fwscanf(f,L"%ls",wstrName)!=EOF) { if (!wcscmp(wstrName,L"[END]")) { break; } propNames.push_back(_bstr_t(wstrName)); } wmi.GetProperties(wstrClass,propNames,propValues); for (int i=0; i<propValues.size(); i++) { cout<<endl; for (int j=0; j<propNames.size(); j++) { cout<<propNames[j]<<" = "<<propValues[i][j]<<endl; } } propNames.clear(); propValues.clear(); } fclose(f); } Додаток 2. CompConfigMFCDlg.CPP #include "stdafx.h" #include "CompConfigMFC.h" #include "CompConfigMFCDlg.h" #include "wmiCompConfig.cpp" #ifdef _DEBUG #define new DEBUG_NEW #endif // CCompConfigMFCDlg dialog CCompConfigMFCDlg::CCompConfigMFCDlg(CWnd* pParent /*=NULL*/) : CDialog(CCompConfigMFCDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CCompConfigMFCDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE1, m_propTree); } BEGIN_MESSAGE_MAP(CCompConfigMFCDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_MENUSELECT() ON_COMMAND(ID_REFRESH, &CCompConfigMFCDlg::OnRefresh) ON_COMMAND(ID_EXIT, &CCompConfigMFCDlg::OnExit) END_MESSAGE_MAP() // CCompConfigMFCDlg message handlers BOOL CCompConfigMFCDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CCompConfigMFCDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CCompConfigMFCDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } // Get ...
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

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

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!