Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС лабы / ОС - Лабораторная работа 1.doc
Скачиваний:
63
Добавлен:
01.06.2015
Размер:
1.18 Mб
Скачать

2

МИНОБРНАУКИ РОССИИ

Федеральное государственное автономное образовательное учреждение высшего профессионального образования «ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

Факультет автоматики и вычислительной техники

Кафедра математического обеспечения и применения ЭВМ

Руководство к лабораторной работе № 1

«Исследование обмена сообщениями в Windows»

по курсу

«Операционные системы»

Составители: Болотов М.В., Дроздов С.Н.

Для студентов направлений/специальностей

231000 «Программная инженерия»

230100 «Программное обеспечение средств вычислительной техники и автоматизированных систем»

010500 «Математическое обеспечение и администрирование информационных систем»

090302 «Информационная безопасность телекоммуникационных систем»

090303 «Организация и технология защиты информации»

Таганрог   2013

  1. Цель работы

Целью данной работы является ознакомление с механизмом сообщений в операционной системе Windows, способами генерации и обработки сообщений, а также приобретение навыков исследования потока сообщений с помощью программыSpy++.

  1. Основные сведения

    1. Нити и сообщения

      1. Процессы и нити

Перед тем, как приступить к изучению работы механизма сообщений в операционной системе Windows, кратко рассмотрим понятия программы, процесса и нити вWindows.

Программа (приложение)это набор исполняемых команд, хранящийся вEXE-файле и загружаемый в оперативную память при выполнении.

Процесс– это контейнер для набора ресурсов, используемых для выполнения экземпляра программы. Процесс включает в себя:

  • виртуальное адресное пространство – диапазон адресов виртуальной памяти, которым может пользоваться процесс;

  • исполняемую программу – коды команд и данные, размещаемые в виртуальном адресном пространстве;

  • список открытых описателей («хэндлов») различных системных ресурсов, доступных всем нитям данного процесса;

  • уникальный идентификатор процесса;

  • первичную нить;

  • маркер доступа, идентифицирующий пользователя и привилегии, сопоставленные процессу.

Нить (thread; иногда переводится также «поток») – это последовательность выполнения команд программы в рамках процесса. Каждый процесс содержит, как минимум, одну нить, создаваемую при старте приложения (первичную нить). Первичная нить может порождать дополнительные нити, выполняемые параллельно с нею.Windowsвыделяет кванты процессорного времени для каждой нити. Все нити работают в едином виртуальном адресном пространстве процесса и могут использовать все его глобальные переменные и ресурсы.

      1. Механизм сообщений в Windows

Все операционные системы семейства Windowsотносятся к типусистем, управляемых событиями. Это означает, что работа прикладных программ строится не в виде непрерывного потока выполнения операций, а в виде реакции программы на определенный набор событий, таких как движение мыши, нажатие клавиши, срабатывание таймера и др., т.е. изменений в состоянии системы и внешних устройств. В системеWindowsэти события называютсясообщениями(Message), и с каждым сообщением связана структура данных, содержащая информацию, полезную для обработки сообщения. Эта структура на языкеC++, описанная в файлеWINUSER.H, определяется следующим образом:

/* структура сообщения */

typedef struct tagMSG

{

HWND hwnd; // хэндл окна, которому предназначено

// сообщение

UINT message; // идентификатор (тип) сообщения

WPARAM wParam; // дополнительная информация

LPARAM lParam; // к сообщению

DWORD time; // время посылки сообщения

POINT pt; // положение курсора мыши

} MSG;

Здесь hwnd– числовой описатель (хэндл,handle) окна-получателя. Он присваивается окну при создании. Есть также возможность определить хэндл окна по координатам точки на экране. Допускается специальное значениеHWND_BROADCAST, означающее посылку сообщения всем окнам верхнего уровня, существующим в системе (но не дочерним окнам, к которым относятся кнопки, поля ввода и прочие управляющие элементы). Если сообщение послано не окну, а самому процессу (точнее, одной из его нитей), то значениеhwndустанавливается равнымNULL.

Идентификатор (тип) сообщения messageопределяет, что, собственно говоря, случилось. Как правило, в тексте программ тип сообщения указывается в виде одной из многочисленных системных констант, напримерWM_MOUSEMOVE (0x0200)илиWM_TIMER(0x0113).

Идентификаторы сообщений могут принадлежать одному из нескольких диапазонов.

  • С 0х0000 до 0x03FF– системные сообщения, их идентификаторы изначально заданы вOCи не могут быть переопределены.

  • С 0х0400 (константаWM_USER) до 0x7FFF– пользовательские сообщения, которые определяются в приложении и используются для обмена сообщениями между окнами этого приложения. В этом же диапазоне располагаются идентификаторы тех сообщений, которые элементы управления (кнопки, поля ввода, поля со списком, полосы прокрутки и т.п.) посылают своему родительскому окну, оповещая о нажатии пользователем кнопки, выборе из списка и т.п. Сообщения из этого диапазона обычно не посылаются другим приложениям, поскольку те их просто «не поймут».

  • С 0х8000 (константаWM_APP) до 0xBFFF– вWindowsверсииNT4.0 и выше данный диапазон также отведен для пользовательских сообщений.

  • С 0хС000 до 0xFFFF– идентификаторы сообщений, определяемых во время исполнения, если пользовательская программа вызывает функциюRegisterWindowMessage.

  • Больше 0xFFFF– идентификаторы, зарезервированные за ОС.

Сообщения, посылаемые элементам управления окна, могут иметь префиксы, отличные от WM_, так, например,BM_– сообщения для кнопок (Button Messages);LB_– для списков (ListBoxes).

Параметры wParamиlParam– это 4-байтовые значения, смысл которых зависит от конкретного сообщения.

Параметр timeзадает время посылки сообщения в миллисекундах от момента запуска операционной системы.

Параметр ptзадает экранные координаты курсора мыши в момент посылки сообщения (два целых числа,xиy). Этот параметр важен при обработке сообщений от мыши.

Когда и с какой целью посылаются сообщения? Самый общий ответ на этот вопрос звучит очень просто: они посылаются во всех случаях, когда в работе системы происходит некоторое событие, которое может оказаться важным для какой-либо программы. Задача сообщения – известить о событии «тех, кого это касается». Например, если событие связано с мышью (была нажата или отпущена одна из кнопок либо мышь была перемещена), то система посылает соответствующее сообщение тому окну, на котором в момент события находился курсор. В других случаях сообщение может быть послано конкретно указанной нити или окну либо, наоборот, всем окнам в системе.

Большая часть сообщений Windows(хотя далеко не все сообщения) связана с функционированием системы оконного интерфейса (GUI) – открытием и закрытием окон, изменением их размера и позиции, сменой активного окна, перемещением курсора по окну, нажатием кнопок в окне и т.п.

Система Windowsвсегда готова к тому, что прикладная программа может не выполнить обработку сообщения (на самом деле, программист обычно использует только некоторые из получаемых его программой сообщений). В этом случае система выполняет некоторую стандартную обработку, предусмотренную для данного типа сообщений, либо не выполняет никаких действий.

Строго говоря, можно написать программу для Windows, не использующую сообщений. Однако в этом случае работать с оконным интерфейсом будет невозможно.