- •Лабораторна робота №1 Загальні теоретичні відомості:
- •Питання для самоконтролю:
- •Лабораторна робота №2 Системний реєстр Windows
- •Огляд системного реєстру
- •Скарбниця імен
- •Призначений для користувача модуль
- •Системний блок
- •Загальний модуль
- •Ключі конфігурації
- •Конфігураційні файли win.Ini і system.Ini
- •Питання для самоконтролю:
- •Лабораторная работа №3
- •Основы программирования в операционной системе Windows
- •Вызов функций api
- •Структура окна
- •Принципы построения оконных приложений
- •Структура окна
- •Параметры dwExStyle:
- •Параметры dwStyle :
- •12. Функция ExitProcess :
- •17. Функция BeginPaint:
- •Сообщения, посылаемые списку
- •Вопросы для подготовки к сдаче лабораторной работы.
- •Лабораторная работа №4
- •Язык описания ресурсов
- •Пиктограммы
- •Курсоры
- •Акселераторы
- •Api – функции
- •Вопросы для подготовки к сдаче лабораторной работы.
- •Лабораторная работа №5
- •Типы многозадачности
- •Использование многопоточности в приложениях Delphi
- •Синхронизации потоков
- •Критические секции
- •Пример создания многопоточного приложения в Delphi:
- •Лабораторная работа №6 «Специальные объекты синхронизации»
- •Событие (event)
- •Мьютекс (mutex )
- •Семафор (semaphore)
- •Crytical Sections
Вызов функций api
Для наглядности рассмотрим подробно одну из API-функций – int MessageBox (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
Данная функция выводит на экран окно с сообщением и кнопкой выхода. Смысл параметров: hWnd – дескриптор окна, в котором будет появляться окно-сообщения, lpText – текст, который будет появляться в окне, lpCaption – текст в заголовке окна, uType – тип окна, в частности можно определить количество кнопок выхода. Все параметры являются 32-х битными целыми числами. По причине, которая будет объяснена позже, к имени функции нам придется добавлять суффикс «А», кроме того, при использовании MASM необходимо также в конце имени добавить @16 (CALL MessageBoxA@16).
Параметры функции следует предварительно, перед вызовом функции, поместить в стек командами PUSH, по правилу «слева направо – снизу вверх».
Пример:
Пусть дескриптор окна расположен по адресу HW, строки – по адресам STR1 и STR2, а тип окна сообщения – это константа. Самый простой тип имеет значение 0 и называется MB_OK. Имеем следующее:
MB_OK equ 0
.
.
STR1 DB “Неверный ввод! “,0
STR2 DB “Сообщение об ошибке.”,0
HW DWORD ?
.
.
PUSH MB_OK
PUSH OFFSET STR1
PUSH OFFSET STR2
PUSH HW
CALL MessageBoxA@16
Результат выполнения любой функции – это, как правило, целое число, которое возвращается в регистре EAX.
Структура окна
Мы будем рассматривать классическую структуру программы под Windows. В такой программе имеется главное окно, а следовательно, и процедура главного окна. В целом, в коде программы можно выделить следующие разделы:
Регистрация класса окон;
Создание главного окна;
Цикл обработки очереди сообщений;
Процедура главного окна.
Конечно в программе могут быть и другие разделы, но данные разделы образуют основной скелет программы. Разберем эти разделы по порядку.
Регистрация класса окон
Регистрация класса окон осуществляется с помощью функции RegisterClassA, единственным параметром которой является указатель на структуру WNDCLASS, содержащую информацию об окне.
Создание окна
На основе зарегистрированного класса с помощью функции CreateWindowExA (или CreateWindowA) можно создать экземпляр окна. Как можно заметить, это весьма напоминает объектную модель программирования.
Цикл обработки очереди сообщений
Вот как выглядит этот цикл на языке Си:
While (GetMessage (&msg, NULL,0,0))
{
// разрешить использование клавиатуры путем трансляции сообщений
// о виртуальных клавишах в сообщении об алфавитно-цифровых
// клавишах
TranslateMessage(&msg);
// вернуть управление Windows и передать сообщение дальне
// Процедура окна
DispatchMessage(&msg);
}
Функция GetMessage() «отлавливает» очередное сообщение из ряда сообщений данного приложения и помещает его в структуру MSG.
Что касается функции TranslateMessage, то ее компетенция касается сообщений WM_KEYDOWN и WM_KEYUP, которые транслируются в WM_CHAR и WM_DEDCHAR, а также WM_SYSCHAR и WM_SYSDEADCHAR.
Выход из цикла ожидается только в том случае, если функция GetMessage возвращает 0. Это происходит только при получении сообщения о выходе (WM_QUIT).
Процедура главного окна
Вот прототип функции окна на языке С:
LRESULT CALLBACK WindowFunc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
hwnd – идентификатор окна;
message – идентификатор сообщения;
wParam и lParam – параметры, уточняющие смысл сообщения (для каждого сообщения могут играть разные роли или не играть никаких). Все четыре параметра имеют тип DWORD.
Скелет на языке ассемблера имеет следующий вид:
WNDPROC PROC
PUSH EBP
MOV EBP, ESP ;
PUSH EBX
PUSH ESI
PUSH EDI
PUSH DWORD PTR [EBP+14H] ;
PUSH DWORD PTR [EBP+10H] ;
PUSH DWORD PTR [EBP+0CH] ;
PUSH DWORD PTR [EBP+08H] ;
CALL DefWindowProcA@16
POP EDI
POP ESI
POP EBX
POP EBP
RET16
WNDPROC ENDP