
- •Системное по. Цели, задачи, классификация
- •Операционная система. Основные функции ос. Структура операционной системы.
- •Общая характеристика операционных систем Microsoft: семейства dos, Windows
- •Интерфейс прикладных программ (api). Apidos (программные прерывания) и Win32
- •Дисковая подсистема в архитектуре ibmpc
- •Низкоуровневая организация дисковой памяти. Сервис bios доступа к дисковой подсистеме.
- •Понятие файловой системы. Назначение, требования, функции. Способы организации фс.
- •Объекты файловой системы: файлы, директории, логические устройства, другие виды объектов.
- •Файловые системы на основе fat
- •X.2 Файловая система ntfs
- •Служебные структуры fat и их использование
- •Программный интерфейс файловой системы (функции для взаимодействия с фс, файлового ввода-вывода) – dos, Windows Функции общего назначения
- •Файловый ввод-вывод
- •14. Адресное пространство процесса (задачи).
- •15. Приложения Windows (Win 32), разновидности. Структура оконных приложений
- •1. Основные определения
- •2. Особенности приложений Win 32.
- •3. Событийное управление
- •4. Структура приложения
- •16. Окно Win32: назначение, виды, свойства. Оконные классы.
- •17. Создание и управление окнами.
- •18. Событийное управление в Win32. Сообщения и очереди сообщений Windows (Windowsmessages): назначение, структура, отсылка, доставка, обработка Сообщения и очереди сообщений.
- •19. Цикл обработки сообщений. Оконная процедура: назначение, выполнение, способы активизации и завершения.
- •20. Многозадачность, многозадачные операционные системы, особенности выполнения приложений в многозадачной среде. Модель многозадачности Win 32
- •21. Состояния процессов (многозадачная среда). Состояния процессов (потоков)
- •22. Многозадачность в win32. Планирование и выполнения программ в win32
- •23. Процессы win32. Атрибуты и состояния процессов. Порождение процессов и управление ими. Основы управления процессами Win32
- •24. Потоки и многопоточные приложения. Порождение потоков, состояние потоков, управление ими. Основы управления потоками Win32
- •25. Нити – альтернативное управление выполнением программы Управление нитями
- •26. Распределение времени выполнения программ в многозадачной системе. Приоритеты. Распределение времени между потоками (управление приоритетами)
- •27. Приоритеты процессов и потоков win32. Управление приоритетами.
- •28. Взаимодействие процессов/потоков, взаимное исключение, синхронизация (базовые сведения)
- •29. Реализация взаимного исключения. Механизм criticalsection.
- •30. Синхронизация при управлении процессами и потоками
- •31. Функция ожидания
- •32. Использование каналов и почтовых ящиков для обмена данными
- •33. Использование файловой системы для обмена данными
- •X.2.6. Использование сообщения wm_copydata
- •34. Графическая подсистема win32 – общая характеристика, основные принципы.
- •35. Основные объекты win32 gdi. Средства векторной и растровой графики
- •Растровая графика
- •36. Подсистема памяти. Основные задачи, функции, требования
- •37. Виртуальное адресное пространство, управление памятью.
- •38. Динамическое распределение памяти программами (heap). HeapApiWin32.
- •Функции работы с кучами (heap-область)
- •39. Подсистема памяти win32. Регионы(области) памяти. Группы функций api подсистемы памяти. Адресное пространство процесса.
- •40. Управление на уровне менеджера вирнуальной памяти. (vmm)
- •41. Отображение файлов в память Проецирование файлов в память
- •42. Системный реестр windows: назначение, организация, доступ
17. Создание и управление окнами.
Создание окна
Для порождения окна (в том числе и главного окна приложения) используется функция CreateWindow (или CreateWindowEx). В общем случае приложение, создающее окно, должно определить следующие характеристики, передаваемые в качестве параметров:
1) имя класса окна (window class)
2) заголовок приложения, имя окна (window name)
3) стиль окна (windowstyle)
4) 2 целочисленных значения – координаты левого верхнего угла окна (location)
5) 2 целочисленных значения – размеры окна (size)
6) описатель родительского окна или окна-хозяина (parent or owner window), NULL если независимое окно (т.е. владелец – система)
7) дентификатор дочернего окна (для окон-потомков) или описатель меню (для окон верхнего уровня) (child-window identifier or menu handle)
8) описатель экземпляра программы (instance handle)
9) дополнительные данные (creation data) (??)
(??)– место в порядке расположения (position in the Z-order)
Получить окна (их описатели), связанные в иерархии с данным, можно с помощью функции GetWindow, первый параметр – описатель известного окна, второй специфицирует способ поиска (например, окно – владелец заданного окна).
Базовую информацию об окне можно получить, например, с помощью функции GetWindowInfo.
18. Событийное управление в Win32. Сообщения и очереди сообщений Windows (Windowsmessages): назначение, структура, отсылка, доставка, обработка Сообщения и очереди сообщений.
В многозадачной операционной системе, в т.ч. Windows, приложения не должны ожидать ввода, равно как и других операций, связанных с неопределенным ожиданием, путем вызова специальных функций типа getchar(), либо проверять некоторое условие путем постоянной его проверки. Подобная организация вычислительного процесса является непроизводительной тратой дефицитного (для других приложений) времени процессора. Приложения должны обращаться к соответствующим системным вызовам и переходить в состояние ожидания, а операционная система сама осуществляет ввод и принимает решение, кому он предназначен, после чего вновь активизирует получателя.
Данный подход в действительность используется шире, чем только для обслуживания ввода-вывода, но и для организации взаимодействия программ и подпрограмм – концепция т.н. событийного управления. Она включает не только сам порядок работы модуля (активность – ожидание – активизация), но и унифицированные средства его обеспечения – в случае Win 32 это механизм передачи и обработки сообщений.
За каждым окном закреплена специальная функция, так называемая процедура окна. Для уведомления окна о предназначенном ему вводе или о каком-либо другом событии Windows вызывает эту процедуру и передает ей в качестве параметра код события и другие параметры. Процедура должна произвести необходимые действия, соответствующие данному событию, и вернуть управление операционной системе.
Вызов функции окна называют передачей сообщения этому окну. В качестве обязательного параметра в функцию окна передается именованная константа, называемая кодом или идентификатором сообщения (message identifier)
Другие параметры определяют дополнительные данные, связанные с данным сообщением. Например, при нажатии левой кнопки мыши в тот момент, когда указатель мыши находится над клиентской областью окна, окну передается сообщение WM_LBUTTONDOWN. При этом в качестве параметров передаются координаты указателя и состояние других кнопок мыши и клавиш SHIFT и CTRL.
Структура MSG.
Получение сообщений
Каждый поток имеет свою очередь сообщений. Очередь может содержать достаточно большое количество сообщений любых типов. При выборке сообщения могут быть рассортированы по типу и адресате, но в порядок выборки после фильтрации соответствует порядку постановки их в очередь.
При нормальном функционировании поток должен просматривать свою очередь сообщений, извлекать из нее сообщения и направлять их на обработку соответствующему окну. Если первая стадия целиком контролируется потоком (функции получения сообщения из очереди сугубо служебные), то на второй выбор обработчика сообщения осуществляется системой. Для работы с сообщениями определен ряд функций.
BOOLGetMessage(LPMSGlpMessage,HWNDhWindow,UINTnMsgMin,UINTnMsgMax) – выборка сообщения из очереди. Параметр hWindow задает окно, чьи сообщения будут приняты (значение NULL соответствует всем окнам данного приложения), nMsgMin и nMsgMax – нижнюю и верхнюю границы диапазона принимаемых сообщений (нулевые границы соответствуют всем имеющимся сообщениям без ограничений). Функция заполняет переданную структуру lpMessge и возвращает код результата: нулевое значение (FALSE) если принято сообщение WM_QUIT (завершение приложения) или ненулевое (TRUE) во всех остальных случаях. При отсутствии в очереди подходящих сообщений функция ожидает их появления, вызвавший ее поток на это время блокируется.
BOOL PeekMessage(LPMSG lpMessage,HWND hWindow,UINT nMsgMin,UINT nMsgMax,WINT wRmFlag) – проверка сообщения в очереди или выборка без ожидания. Отличается от предыдущей тем, что при отсутствии в очереди подходящих сообщений немедленно возвращает нулевое значение, в остальных случаях код возврата ненулевой. Дополнительный параметр wRmFlag указывает на способ обращения с обнаруженным сообщением: PM_REMOVE – сообщение удаляется из очереди, PM_NOREMOVE – сообщение не удаляется.
BOOLWaitMessage(void) – ожидание появления сообщения в очереди. Вызвавший поток переводится в состояние ожидания до появления в его очереди хотя бы одного сообщения любого типа.
Посылка сообщений
Существуют 2 способа посылки сообщений: непосредственная передача (вызов) оконной процедуры и передача посредством очереди сообщений (т.е. с буферизацией). Основным способом считается передача через очередь сообщений. Цикл обработки сообщений приложения рассчитан именно на выборку сообщений из этой очереди. Непосредственная передача сообщения подобна вызову подпрограммы: при передаче в рамках одного приложения происходит простая передача управления обработчику, между приложениями – активизация приложения-получателя и его обработчика. Определены следующие основные функции посылки сообщений.
LRESULTSendMessage(HWNDhWindow,UINTnMsg,WPARAMWParam,LPARAMLParam) – непосредственная передача сообщения обработчику. Параметр hWindow идентифицирует окно-получатель сообщения, а остальные параметры определяют соответствующие параметры сообщения (см. выше). Результатом функции является значение кода возврата оконной процедуры получателя, поэтому выполнение потока, вызвавшего SendMessage, приостанавливается до окончания обработки этого сообщения.
BOOLSendMessage(HWNDhWindow, UINTnMsg, WPARAMwParam, LPARAMlParam) – передача сообщений посредством очереди (постановка в очередь). Список его параметров аналогичен, но возврат из функции всегда немедленный, и результат отражает успешность вызова: нулевое значение является признаком ошибки.
BOOLSendNotifyMessage(HWNDhWindow, UINTnMsg, WPARAMwParam,LPARAMlParam) – совмещает свойства предыдущих: передача сообщения непосредственно в обработчик, но без ожидания его выполнения и без анализа результата обработки. Возвращаемое значение характеризует результативность вызова: ноль (FALSE) соответствует ошибке.
Сопоставляя функции, можно отметить следующее:
1) SendMessage() обеспечивает двусторонний обмен информацией, т.к. подразумевает содержательный код возврата, что приближает ее по функциональности к вызову подпрограммы; в то же время, в случае неготовности или неспособности получателя обработать такое сообщение программа-источник будет заблокирована;
2) PostMessage() позволяет избежать блокировки, более того, сообщение может быть поставлено в очередь даже не существующего приложения. Однако факт обработки или игнорирования сообщения целиком зависит от приложения-получателя;
3) SendNotifyMessage() не имеет обратной связи, не вызывает блокировок и гарантирует быстрое получение сообщения адресатом.
4) PostThreadMessage() также работает через очередь сообщений, но получателем является не окно, для которого система будет подбирать соответствующий ему поток, а непосредственно поток (по ID потока). Т.о., просто удаляется одно звено в цепи поиска получателя, и появляется возможность адресовать сообщения потокам, не связанным с окнами.
Как следствие, по соображениям надежности предпочтительнее передача сообщений через очередь, если только не требуется обратная связь. Стандартно так передаются сообщения информационного типа: ввода-вывода, таймер, перерисовка и т.п. Некоторые сообщения следует обязательно передавать через очередь, например, WM_QUIT, для которого предусмотрена специальная функция PostQuitMessage().
Примечание. При необходимости обратная связь может быть достигнута обратной посылкой сообщения-квитанции, требуемое алгоритмом взаимодействия ожидание может контролироваться самим ожидающим потоком.
В всех случаях в качестве окна-получателя допустимо указывать константу HWND_BROADCAST, что соответствует "широковещательной" посылке его всем существующим в системе окнам верхнего уровня, включая невидимые. Кроме того, в PostMessage() можно использовать значение этого параметра NULL – сообщение передается в очередь того же потока, который его посылает; аналогично можно использовать и PostThreadMessage().
Пользовательскиесообщения
UINT RegisterWindowMessage( LPCTSTRlpStr // address of message string);
Использование сообщений для обмена данными
Используя собственные сообщения, можно пересылать данные от одного окна другому. При этом в качестве параметров сообщения, например, можно указывать адрес области передаваемых данных и ее длину. Проблема возникает при необходимости предать данные другому процессу, поскольку в данном случае адрес области данных не имеет никакого смысла. Ведь у каждого процесса собственное адресное пространство. Для передачи данных необходимо создать разделяемый участок памяти и использовать его для передачи данных. Для этого существует специальное сообщение WM_COPYDATA.
Параметр code функции MessageProc указывает тип события, сгенерировавшего данное сообщение:
MSGF_DDEMGR – The input event occurred while the Dynamic Data Exchange Management Library (DDEML) was waiting for a synchronous transaction to finish. For more information about DDEML, see Dynamic Data Exchange Management Library.
MSGF_DIALOGBOX – событие в диалоговом окне, в т.ч. в окне MessageBox.
MSGF_MENU – событие в меню.
MSGF_NEXTWINDOW – событие переключения окон по Alt-Tab.
MSGF_SCROLLBAR – событие в окне (полосе) пркрутки.
Если код меньше 0, необходимо вызывать функцию CallNextHookEx without further processing и использовать ее код возврата.
Напомним, что устранение обработчика WM_DESTROY приведет к тому, что после закрытия окна приложения в памяти будет оставаться его процесс.
Константы, описывающие предопределенные системные (systemdefined) сообщения имеют префиксы, соответствующие их категориям. Основные категории приведены в прил. Х:
Среди сообщений, специфичных для элементов управления, можно выделить извещающие сообщения (от элемента к родительскому окну), сообщения-команды и сообщения-запросы. Так, например, элемент "кнопка" при нажатии (т.е. при поступлении пары сообщений WM_LBUTTONDOWN и WM_LBUTTONUP) генерирует сообщение BN_CLICKED типа NOTIFY, которое содержит информацию об элементе-источнике (идентификатор и описатель). Данное сообщение принимается и обрабатывается в родительском окне как сообщение WM_COMMAND (см. ниже).
Сообщение BM_CLICK программно эмулирует нажатие заданной кнопки, но не отрисовывает изменения ее внешнего вида. Для этого служит сообщение BM_SETSTATE:
BM_CLICK:
wParam = 0;
lParam = 0;
BM_SETSTATE
wParam = (WPARAM) fState; Если TRUE, то кнопка выделена (нажата – highlighted)
lParam = 0;
Эти сообщения возвращают 0.
Сообщения-запросы возвращают информацию в виде кода возврата. Это значение возвращаемое оконной процедурой и, соответственно, функцией непосредственного вызова обработчика SendMessage. Так, сообщение-запрос BM_GETSTATE позволяет программным путем получить текущее состояние элемента:
BM_GETSTATE
wParam = 0; // not used; must be zero
lParam = 0; // not used; must be zero
This message has no parameters.
Код возврата представляет собой двоичную маску:
0x0003 – состояние (check state) дляradio buttonsиcheck boxes: BST_UNCHECKED, BST_CHECKED или BST_INDETERMINATE.
BST_CHECKED – Indicates the button is checked.
BST_FOCUS – Specifies the focus state. A nonzero value indicates that the button has the keyboard focus.
BST_INDETERMINATE – Indicates the button is grayed because the state of the button is indeterminate.
BST_PUSHED – Specifies the highlight state. A nonzero value indicates that the button is highlighted.
BST_UNCHECKED – Indicates the button is unchecked. Same as the Windows NT return value of zero.
Общие сообщения также могут служить для программного управления оконными элементами.
"Общее" сообщение WM_COMMAND – универсального сообщения, позволяющего головной оконной функции получать команды от подчиненных окон и др. элементов:
The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.
WM_COMMAND
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control
wNotifyCode – Value of the high-order word of wParam. Specifies the notification code if the message is from a control. If the message is from an accelerator, this parameter is 1. If the message is from a menu, this parameter is 0.
wID – Value of the low-order word of wParam. Specifies the identifier of the menu item, control, or accelerator.
hwndCtl – Value of lParam. Identifies the control sending the message if the message is from a control. Otherwise, this parameter is NULL.
Return Values If an application processes this message, it should return zero.
Remarks
Accelerator keystrokes that select items from the window menu are translated into WM_SYSCOMMAND messages. If an accelerator keystroke occurs that corresponds to a menu item when the window that owns the menu is minimized, no WM_COMMAND message is sent. However, if an accelerator keystroke occurs that does not match any of the items in the window's menu or in the window menu, a WM_COMMAND message is sent, even if the window is minimized.
If an application enables a menu separator, the system sends a WM_COMMAND message with the low-word of the wParam parameter set to zero when the user selects the separator.
Имеется также сообщение WM_SYSCOMMAND, генерируемое при активизации пользователем команд из системного меню, или стандартного меню управления окном, или кнопок изменения размеров окна ("Maximize", "Minimize", "Window").