Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Асемблер ВІДПОВІДІ!!!.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
124 Кб
Скачать
☆

18. Використання ресурсів при роботі з іконками, рядками, курсорами.

Почнемо з перерахування найбільш уживаних ресурсів.

  • Іконки.

  • Курсори.

  • Бітовая картинка.

  • Рядок.

  • Діалогове вікно.

  • Меню.

  • Акселератор.

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

  1. Іконки. Можуть бути описані в самому файлі ресурсів, або зберігатися в окремому файлі *. ICO. Розглянемо останній випадок.

Ось файл ресурсів resu.rc:

# define IDI ICONl 1

IDIJCOH1 ICON "CdromOl.ico"

Як бачите, файл містить лише два значущих рядка. Один рядок визначає ідентифікатор іконки, другий - асоціює ідентифікатор з файлом "CdromOl.ico". Оператор Define є Сі-оператором препроцесора.

Як використовувати цей ресурс у програмі? Тут все просто: припустимо, що ми хочемо встановити нову іконку для вікна. Ось фрагмент програми, який встановлює стандартну іконку для головного вікна.

PUSH IDІ APPLICATION

Push 0

CALL LoadlconA @ 8

MOV [WC.CLSHICON], EAX

А ось фрагмент програми для встановлення іконки, зазначеної у файлі ресурсів:

Push 1; ідентифікатор іконки

Push [HINST]; ідентифікатор процесу

CALL LoadlconA @ 8

MOV [WC.CLSHICON], EAX

  1. Курсори. Підхід тут повністю ідентичний.

#define IDIICON1 1

#define IDI_CUR1 2

ID1JCON1 ICON "CdromOl.ico"

IDI_CUR1 CURSOR "4way01.cur"

А ось фрагмент програми, що викликає іконку і курсор.

;---------------------------------------Іконка вікна

Push 1; ідентифікатор іконки Push [HINST]

CALL LoadlconA @ 8

MOV [WC.CLSHICON], EAX

;---------------------------------------Курсор вікна

Push 2; ідентифікатор курсора

Push [HINST]

CALL LoadCursorA @ 8

MOV [WC.CLSHCURSOR], EAX

  1. Рядки. Щоб задати рядок або декілька рядків використовується ключове слово STRINGTABLE. Нижче представлений текст ресурсу, задає два рядки. Для завантаження рядки в програму використовується функція LoadString (див. нижче). Строки, що задаються у файлі ресурсів, можуть відігравати роль констант.

#define STR1 1

#define STR2 2 STRINGTABLE

{

STR1, "Повідомлення"

STR2, "Версія 1.01"

}

19-20. Процеси. Створення процесу, Завершення процесу.

Процеси.

Під процесом будемо розуміти об'єкт, який створюється операційною системою Windows при завантаженні для виконання модуля і отримує в одноосібне користування:

  • Віртуальну пам'ять, яка виділяється для нього операційною системою.

  • Дескриптори відкриваних ним файлів.

  • Список завантажених ним у його власну пам'ять динамічних модулів (DLL).

  • Створені ним підпроцеси або потоки, що виконуються незалежно один від одного, у власній пам'яті процесу.

Простіше кажучи кожен виконуваний модуль (. ЕХЕ), запущений в операційній системі Windows, стає процесом.

Кожен процес у відведеному для нього адресному просторі може породжувати ще процеси. Ці процеси виконуються незалежно один від одного і від породжующого їх процесу. Однак породжуючий процес може гіри бажанні "вбити" будь-який з породжених ним процесів. Такі процеси називають ще потоками.

Тепер розглянемо деякі типи багатозадачності. У старій 16-бітної Windows перемикання між завданнями відбувалося лише тоді, коли завдання віддавало управління операційною системою. Така багатозадачність називається невитисняючою. У певному сенсі це було навіть гірше, ніж в операційній системі М8 ООБ. Там елементи багатозадачність здійснювалися за допомогою так званих ТSR-програм. Такі програми називалися ще резидентні. Вони перехоплюють переривання від таймера, клавіатури або іншого пристрою і мали можливість час від часу отримувати управління.

Положення, що існували в старій операційній системі Windows, вимагали від програміста виконання джентльменського правила - не захоплювати надовго час мікропроцесора. Деяким вирішенням проблеми було використання таймерів, а також використання функції РееkMessage замість GetMessage. Функція PeekMessage, на відміну від GetMessage, повертає управління відразу, навіть якщо в черзі немає жодного повідомлення.

У 32-бітних операційних системах Windows (Windows 9х, Windows NТ, Windows 2000) реалізована витісняюча схема багатозадачності, в якій перемиканням між процесами і потоками займається операційна система. Якщо процес занадто довго виконує деяку операцію, то курсор над вікном процесу перетворюється в пісочний годинник. При цьому інші процеси, як і раніше виконуватися, і Ви зможете перемикатися на них. А от доступ до вікна даного процесу може виявитися важким. Вирішити цю проблему можна вже згаданим способом, замінивши в циклі очікування GetMessage на РееkMessage. Однак більш правильним рішенням буде розбивка процесу на певну кількість потоків.

Створити процес можна за допомогою функції CreateProcess.

Параметри:

1-й параметр - вказує на ім'я завантажуваної програми. Ім'я може містити повний шлях до програми.

  1. й параметр - його значення залежить від того, чи є перший параметр NULL (0) чи ні. Якщо перший параметр вказує на рядок, то цей параметр трактується як командний рядок запуску (без імені програми). Якщо перший параметр дорівнює NULL, то цей параметр розглядається як командний рядок, перший елемент якого являє собою ім'я програми. Якщо шлях до програми не зазначено, то функція CreateProcess здійснює пошук програми за певним алгоритмом:

Пошук в каталозі, звідки була запущена програма.

Пошук в поточному каталозі.

Пошук в системному каталозі (можна отримати через GetSystemDirectory). Зазвичай системним каталогом є С: \ WINDOWS \ SYSTEM.

Пошук в каталозі Windows (можна отримати через GetWindowsDirectory). Зазвичай цим каталогом є С: \ WINDOWS.

Пошук в каталогах, перерахованих в параметрі PATH оточення.

  1. й і 4-й параметри. Використовуються для завдання атрибутів доступу породжуваного процесу. Зазвичай вважають рівним 0.

  1. й параметр. Якщо цей параметр 0, то породжувані процес не успадковує дескриптор породжуваного процесу, в іншому випадку породжувані процес успадковує дескриптори.

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

  3. й параметр. Є вказівником на буфер, який містить параметри середовища. Якщо параметр дорівнює 0, то породжуваний процес успадковує параметри середовища породжуваного процесу.

  4. й параметр. Задає поточний каталог для породжуваного процесу. Якщо параметр дорівнює NULL, то породжуваний процес успадковує поточний пристрій і каталог породжуваного процесу.

  5. й параметр. Представляє покажчик на структуру, яка містить інформацію про вікно створюваного процесу.

  6. й параметр. Вказує на структуру, заповнюється при виконанні запуск програми.

Ось ця структура:

PROCINF STRUC

liProcess DD? ; Дескриптор створеного процесу.

hThread DD? ; Дескриптор головного потоку нового процесу.

Idproc DD? ; Ідентифікатор створеного процесу.

idTlir DD? ; Ідентифікатор головного потоку нового процесу.

PROCINF ENDS

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

Розглянемо тепер структуру, на яку вказує 9-й параметр функції CreateProcess. Ось ця структура:

STARTUP STRUC

cb DD 0

IpReserved DD 0

lpDesktop DD 0

lpTitle DD 0

dwX DD 0

dwY DD 0

dwXSize DD 0

dwYSize DD 0

dwXCountChars DD 0

dwYCountChars DD 0

dwFiUAttribute DD 0

dwFlags DD 0

wShowWindow DW 0

cbReserved2 DW 0

lpReserved2 DD 0

hStdlnput DD 0

hStdOutput DD 0

hStdError DD 0

STARTUP ENDS

Отже, роберемо сенс полыв цыэъ структури

СB – розмір даної структури в байтах. Заповнюється обов’язково.

IpReserved –резерв, повинне дорівнювати 0

IpDesktop – імя робочого столу.

IpTitle – назва вікна для консольних додатків, що створюють своє вікно. Для інших повинно дорівнювати 0.

dwX - координата X лівого верхнього кута вікна.

dwY - координата Y лівого верхнього кута вікна.

dwXSize - розмір вікна з X.

dwYSize - розмір вікна з Y.

dwXCountChars - розмір буфера консолі по X.

dwYCountChars - розмір буфера консолі по Y.

dwFillUAttribute – початковий колір тексту. Має значення тільки для консольних додатків.

dwFlags –прапор значення полів.

Ось значення цього прапора.

STARTF USESHOWWINDOW lh // Дозволити поле dwShowWindow

STARTF USESIZE 2h //Дозволити dwXSize та dwYSize.

STARTFJJSEPOSITION 4h //Дозволити dwX та dwX

STARTF_USECOUNTCHARS 8h // Дозволити dwXCountChars та dwYCountChars

STARTF_USEFILLATTR1BUTE lOh // Дозволити dwFillUAttribute

STARTF_FORCEONFEEDBACK 40h // Включити повернення курсору

STARTF FORCEOFFFEEDBACK 80h // Вимкнути повернення курсору

STARTFJJSESTDHANDLES lOOh // Дозволити hStdInput

dwShowWindow –визначає спосіб відображення вікна

cbReserved2 – резерв, повинно бути рівно 0

hStdInput – дескриптор введення (для консолі)

hStdOutput – дескриптор виводу (для консолі)

hStdError - дескриптор виводу повідомлення про помилку (для консолі)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]