Понятие API и WinAPI. Назначение WinAPI

1. Понятие API и WinAPI. Назначение WinAPI. Основные библиотеки Win32 и круг решаемых задач.

API (Application Programming Interface - интерфейс прикладных программ) - это множество функций, организованных, обычно, в виде DLL (Dynamic Link Library – динамически подключаемые библиотеки). Функции API позволяют организовать интерфейс между прикладной программой и средой, в которой работает эта программа. Вызов функций API позволяет программе получать доступ к ресурсам среды и управлять ее работой.

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

1. Kernel32.dll – работа с объектами ядра ОС, управление памятью и другими системными ресурсами;

2. User32.dll – управление окнами, обработка сообщений, работа с меню, таймерами и т.д.;

3. GDI32.dll – обеспечение работы графического интерфейса ОС (Graphics Device Interface): функции управления выводом на экран дисплея, управление выводом принтера, функции для работы со шрифтами и т.д.

2. Окно, как объект ОС. Основные понятия, свойства. Стандартные классы окон. Создание пользовательского окна.

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

 «Классическое»  окно состоит из строки заголовка  со значком, кнопками свертывания, развертывания/восстановления и  закрытия окна. Однако окна отнюдь  не ограничиваются подобным классическим  видом.

Как правило, под «окном» обычный пользователь ОС понимает нечто прямоугольное, содержащее различные кнопки и прочие элементы управления*. На самом деле, с точки зрения WinAPI между элементами управления не делается никакой разницы – все они являются окнами ОС.

* Элементы  управления – это объекты, которые  служат для организации интерфейса  между пользователем и программой. Например, кнопки, радио–кнопки, списки, переключатели, текстовые поля, надписи, полосы прокрутки, выпадающие списки и т.д. Таким образом, они являются составной частью интерфейса пользователя – User Interface (UI).

 

Стандартные классы окон:

• Edit (текстовое поле)

• ListBox (список)

• ComboBox  (выпадающий список)

• ScrollBar (полоса прокрутки)

• Button (кнопка)

• Static (надпись)

 

Создание custom-окна (пользовательского окна)

Для того чтобы определить собственное окно и отобразить его на экране, необходимо выполнить ряд этапов:

• Определить класс окна

o определить визуальные свойства окна

o определить процедуру (функцию) окна

• Зарегистрировать класс окна

• Создать окно и получить его дескриптор

• Отобразить окно на экране

• Запустить цикл обработки сообщений

 

3. Сообщение. Очередь сообщений. Цикл обработки сообщений и процедура обработки сообщений.

 

Сообщение – это уведомление о некотором событии. Источником события: пользователь, ОС, другое окно.

 

Очередь сообщений

Во время работы ОС в ней может возникать множество событий. При этом каждое событие обязательно должно быть обработано. События, которые ОС не «успевает» обрабатывать, встают в так называемую очередь сообщений. Очередь сообщений устроена по принципу FIFO (First In First Out).

 

Цикл обработки сообщений

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

 

Процедура обработки сообщения:

Для того чтобы прочитать сообщение из очереди, следует вызвать функцию GetMessage(). Если данная функция возвращает значение, равное нулю, то это означает, что цикл должен быть прерван. В случае если при чтении из очереди сообщений произошла ошибка, данная функция вернет -1. Во всех остальных случаях результатом чтения должно быть положительное число.

 

4. Дочерние окна и диалоги.

5. Главная функция приложения. Отличие оконного и консольного приложения.  Загрузка неуправляемого исполняемого модуля в оперативную память.

 

Главная функция приложения

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

 

Отличие оконного (GUI) и консольного приложения

Оконные приложения ресурсоемкие, чем консольные. В оконных приложениях ввод-вывод осуществляется через графический интерфейс. В консольных приложениях ввод-вывод осуществляется через потоки ввода и вывода.

 

Загрузка неуправляемого исполняемого модуля в оперативную память:

- Открывается файл образа (EXE), который будет выполняться  в процессе.

- Создается объект «процесс»  исполнительной системы.

- Создается первичный  поток (стек, контекст и объект  «поток» исполнительной системы).

- Уведомление о создании нового процесса и потока.

- Выполнение первичного потока (если не указан флаг CREATE_ SUSPENDED).

- Инициализация адресного пространства в контексте нового процесса и потока(например, загружаются требуемые DLL).

- Выполнение программы.

6. Понятие и назначение GDI. Логическое устройство. Контексты устройства для работы с окнами и их отличия между собой. Совместимый контекст устройства (CreateCompatibleDC).

 

Graphics Device Interface (GDI) – это интерфейс представления графических объектов и передачи их на устройства отображения. Отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры.

 

Контекст устройства – это структура данных, служащих для управления информацией о выходном устройстве. Она содержит информацию о параметрах и атрибутах вывода графики на устройство.

 

Для вывода графической информации необходимо создать объект логического устройства (прототип физического), в который и будет осуществляться весь вывод. Логическое  устройство, как и все объекты ОС, имеет ряд атрибутов (параметров) и методов (функций). Меняя значения атрибутов, мы можем влиять на результат работы методов. Объект логического устройства называют контекстом устройства (или контекстом отображения), а его уникальный номер – дескриптором контекста устройства.

 

Контексты устройства для работы с окнами:

Вывод только в рабочей области окна

  • Общий
  • Для класса окон
  • Личный
  • Родительский

Контекст отображения для окна позволяет рисовать в любом месте окна – в области заголовка, системного меню, рамок, кнопок изменения размеров окна, рабочей области и т.д.

Для окна

 

Контекст устройства в памяти (или совместимый контекст) позволяет системе работать с указанным виртуальным устройством, осуществляет вывод на виртуальное графическое устройство, имитируемое в памяти в виде растра.

 

7. Сообщение WM_PAINT. Недействительная область окна. Вывод графики средствами GDI.

 

Если возникает необходимость в перерисовке определенной области окна, в очередь сообщений потока-владельца окна поступает сообщение WM_PAINT. Область, которая требует обновления, называется недействительной (invalid rectangle) и определяется, как наименьшая прямоугольная часть окна, которая должна быть перерисована заново.

 

Для вывода графической информации необходимо создать объект логического устройства (прототип физического), в который и будет осуществляться весь вывод. Логическое  устройство имеет ряд атрибутов (параметров) и методов (функций). ОС не предоставляет прямой ссылки на объект логического устройства, а отдает только его дескриптор (уникальный номер).

8. Понятие ресурсов. Основные типы ресурсов и их назначение. Пользовательский тип ресурсов. Процесс компиляции ресурсов. (В презентации назначения)

 

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

 

Основные типы ресурсов:

• Значки (Icons)

• Курсоры (Cursors)

• Битовые образы (Bitmaps)

• Символьные строки (Character strings)

• Меню (Menus)

• Быстрые комбинации клавиш (Accelerators)

• Окна диалога (Dialog Boxes)

• Пользовательские (Custom)

 

Пользовательские ресурсы

• Используются для хранения пользовательских данных

• Расширяют возможности ресурсов

• Обработка пользовательских типов ресурсов полностью ложится на плечи разработчика

 

Компиляция ресурсов

При создании программы ресурсы определяются в файле описания ресурсов (resource script), который представляет собой текстовый файл (в ASCII-кодировке) с расширением .RC. Файл описания ресурсов может содержать представление ресурсов в ASCII-кодах, а также может ссылаться и на другие файлы (ASCII или бинарные файлы), в которых содержатся остальные ресурсы. С помощью компилятора файл описания ресурсов компилируется и становится бинарным файлом с расширением .RES. После этого компоновщик объединяет объектный файл с кодом программы и ресурсы, таким образом, формируя исполняемый файл.

 

9. Диалоговые окна. Модальные и немодальные диалоги. Особенности диалогов. Функция обработки сообщений окна диалога, ее отличия от процедуры окна. Примеры стандартных диалогов.

 

Диалоговые окна служат для обеспечения обмена информацией между пользователем и приложением.

 

Типы диалоговых окон

• Модальные (modal)

блокирует прочие окна приложения до тех пор, пока не будет закрыто

• Не модальные (modeless)

не блокирует окна приложения

 

Функция обработки сообщений окна диалога:

BOOL CALLBACK DlgProc (

HWND hWndDlg,  // дескриптор окна диалога

UINT message,  // ID сообщения

WPARAM wParam, // параметры сообщения

LPARAM lParam )

    • Подобна функции обычного окна, за исключением некоторых функциональных особенностей

 

Отличия от процедуры окна

  • TRUE возвращается для обработанных сообщений, а FALSE – для необработанных
  • DefWindowProc() для необработанных сообщений НЕ вызывается
  • НЕ обрабатывает сообщения WM_CREATE, WM_PAINT, WM_DESTROY
  • Основные сообщения:

  WM_INITDIALOG

  WM_COMMAND

  • Диалог создается и отображается вызовом одной функции
  • Цикла обработки сообщений у диалогов НЕТ

 

Примеры стандартных диалогов:

  • Диалог открытия файла
  • Диалог сохранения файла
  • Диалог выбора цвета
  • Диалог выбора шрифта
  • Диалог выбора папки

 

 

 

 

10. Объект ядра. Основные свойства объектов ядра.

 

Объект ядра — блок памяти, выделенный ядром и доступный только ему. Этот блок представляет собой структуру данных, в элементах которой содержится информация об объекте. Объекты ядра в основном применяются для их совместного использования несколькими процессами (или потоками).

 

Доступ к объектам ядра осуществляется через их дескрипторы с использованием WinAPI функций.

Объект ядра будет удален только в том случае, если его не использует ни один процесс.

 

Типы объектов ядра:

• Процессы (Process)

• Потоки (Thread)

• Файлы (File)

• Проекции файлов (File-mapping)

• Порты завершения ввода-вывода (I/O completions port)

• Задания (Job)

• Маркеры доступа (Access token)

• Каналы (Pipe)

• Почтовые ящики (Mail-slot)

• Мьютексы (Mutex)

• Семафоры (Semaphore)

• Ожидаемые таймеры (Waitable timer)

 

Общие свойства объектов ядра

• Дескриптор – служит для уникальной идентификации объекта ядра

• Идентификатор процесса – содержит идентификатор процесса, создавшего данный объект

• Дескриптор защиты – определяет права доступа к данному объекту

11. Процессы и потоки. Вытесняющая многозадачность. Жизненный цикл процессов и потоков (на примере однопоточного приложения рассмотреть, как создаются, инициализируются и используются данные объекты).

 

ПРОЦЕСС –экземпляр выполняемой программы, который состоит из двух компонентов:

  • Объекта ядра «Процесс», через который ОС управляет процессом, и который хранит информацию о процессе
  • Адресное пространство ОП, в котором содержится код и данные всех EXE- и DLL-модулей

ПОТОКИ – отвечают за исполнения кода, содержащегося в адресном пространстве процесса

  • Процессы инертны, то есть, чтобы процесс что-нибудь выполнил, в нем нужно создать поток. Именно потоки отвечают за исполнение кода, содержащегося в адресном пространстве процесса.
  • При создании процесса первый (точнее, первичный) поток создается системой автоматически. Далее процесс может порождать другие (дочерние) процессы и потоки, а те в свою очередь – новые и т.д. То есть один процесс может иметь несколько дочерних, в пределах каждого процесса может существовать несколько потоков.

 

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

Стратегия планирования с использованием диспетчера задач получила название вытесняющая многозадачность.

 

Windows – ОС с вытесняющей многозадачностью с разделением по времени. В течении отведенного времени, поток должен завершиться или будет прерван. Прерванные потоки, которые не успели выполниться в течении отведенного интервала времени, помещаются в конец очереди. Активный в данный момент поток может быть прерван другими потоками, которые обладают более высоким приоритетом, или самостоятельно прервать свое выполнение(«сон» потока).

 

12. Классификация ОС.

 

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

•  однозадачные (например, MS-DOS, MSX) и

•  многозадачные (OC EC, OS/2, UNIX, Windows 95).

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

Многозадачные ОС, кроме вышеперечисленных функций, управляют разделением совместно используемых ресурсов, таких как процессор, оперативная память, внешние устройства и проч.

 

По числу одновременно работающих пользователей ОС делятся на:

•  однопользовательские (MS-DOS, Windows 3.x, ранние версии OS/2);

•  многопользовательские (UNIX, Linux, Windows NT).

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

 

Многозадачные ОС подразделяются на три типа в соответствии с использованными при их разработке критериями эффективности:

•  системы пакетной обработки (например, OC EC),

Критерий – решение максимального числа задач в единицу времени

•  системы разделения времени (UNIX, VMS),

Критерий – удобство и эффективность работы пользователя

•  системы реального времени (QNX, RT/11).

Критерий – время реакции системы

Windows - Многопользовательская ОС с вытесняющей многозадачностью с разделением времени.

 

13. Многозадачность в ОС Windows. Понятие кванта. Приостановка работы потока («сон»). Приоритеты процессов и потоков.

 

Windows – это ОС с вытесняющей многозадачностью с разделением по времени, то естественно, что каждому потоку отводится определенный интервал времени (time slice), в течении которого поток выполняется (фактически получает доступ к процессору). В течении отведенного времени, поток должен завершиться или будет прерван. Прерванные потоки, которые не успели выполниться в течении time slice, помещаются в конец очереди. Активный в данный момент поток может быть прерван другими потоками, которые обладают более высоким приоритетом, или самостоятельно на время прервать свое выполнение.

 

Квант (quantum) – период времени вызова аппаратного прерывания, интервал времени которое выделено для задачи.

 

«Сон» потока

• Если для продолжения выполнения, поток должен дождаться чего-то, то он может «заснуть» на определенное время и передать остаток своего процессорного времени другому потоку в очереди

ú Sleep(int milliseconds);

ú Sleep(1) ≥ Quantum

поток засыпает как минимум на указанное количество миллисекунд

 

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

 

Приоритеты потоков

Приоритет определяет очередь, в которой будет стоять поток, а не продолжительность отыденного промежутка времени(time slice).

В Windows каждый поток имеет свой приоритет. Потоки с самым высоким приоритетом, выполняются в первую очередь, и пока они не выполняться, остальные потоки будут находиться в состоянии ожидания.

 

Windows поддерживает шесть классов приоритета:

  • real time (реального времени);
  • high (высокий);
  • above normal (выше среднего);
  • normal (средний);
  • below normal (ниже среднего);
  • idle (низкий).

14. Переменные окружения. Понятие, назначение, примеры использования. Типы переменных окружения, их отличия.

 

Переменные окружения (environment variables) – это область памяти, к которым имеет доступ определенный процесс (или процессы). Процесс может получить доступ к переменным окружения, создав их, либо унаследовав от родительского процесса. Это самый простой способ организации межпроцессного взаимодействия.

Переменные окружения хранятся в оперативной памяти в виде строк вида:

<Имя переменной>=<Значение>\0

 

Основное предназначение переменных окружения состоит в том, чтобы хранить в них постоянные данные, которые могут быть использованы другими процессами.

 

Пример использования

• Пример описания переменной окружения:

MyMusic=D:\Music\0

• Пример использования переменной окружения:

%MyMusic%\Artist\sound.mp3

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

 

Типы переменных окружения:

• Системные - переменные, определенные в реестре и доступные для всех процессов в системе

• Пользовательские - переменные, определенные в реестре для данной учетной записи и доступные для процессов, запущенных под этой учетной записью

• Процессы

    1. Собственные - переменные, созданные самим процессом
    2. Унаследованные - переменные, унаследованные от родительского процесса

 

15. Объект ядра «Задание». Понятие, назначение, примеры использования. Виды ограничений задания. Информация о задании. Жизненный цикл заданий.

 

Задание (job) – объект ядра, позволяет группировать процессы и помещать их в нечто вроде «песочницы», выполняющей роль контейнера процессов; ограничивающая их действия.

 

Пример: создание задания в WinAPI

HANDLE CreateJobObject ( PSECURITY_ATTRIBUTES scur, // информация о защите

PCTSTR name ); // имя задания

 

Виды ограничений

• Базовые и расширенные базовые ограничения - не дают процессам в задании монопольно захватывать системные ресурсы, накладывают лимит на использование системных ресурсов.

  1. Максимальное время работы процесса
  2. Максимальное время работы всех процессов задания
  3. Максимальное количество одновременно выполняемых процессов задания
  4. Процессоры, где должны выполняться процессы задания
  5. Относительная продолжительность кванта времени для всех потоков задания

• Базовые ограничения на UI - блокируют возможность изменения на пользовательский интерфейс(UI), позволяют запретить процессам задания вызов некоторых UI-функций и заблокировать доступ к USER-объектам, созданных внешними по отношению к этому заданию процессами.

  1. вызов команд на выход из системы, завершение ее работы, перезагрузку или выключение компьютера
  2. чтение и/или запись в буфер обмена
  3. изменение параметров экрана
  4. создание и переключение между рабочими столами
  5. использование USER-объектов (например, HWND), созданных внешними по отношению к этому заданию процессами

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

  1. закрыть доступ администратору;
  2. запретить маркер неограниченного доступа;
  3. блокировать доступ по каким-либо идентификаторам защиты (security ID, SID);
  4. отменить указанные привилегии и т.д.

 

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

 

  • Создание объекта-задания (Job)
  • Связывание задания с ограничениями
  • Создание процессов, которые следует включить в задание
  • Добавление процессов в задание
  • Завершение процессов задания

 

16. Синхронизация потоков. Атомарный доступ, критические секции. Механизм синхронизации потоков с использованием объектов ядра. Основные объекты синхронизации. Функции ожидания (wait-функции).

 

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

 

Доступ к общему ресурсу

• Пользовательский режим

    • Атомарный доступ: Interlocked-функции
    • Критические секции

• Режим ядра

    • Объекты ядра

 

Атомарный доступ (atomic access) – монопольный захват ресурса обращающимся к нему потоком. Позволяет получить доступ к ресурсу без прерывания другими потоками. Семейство блокирующих функций(Interlocked-функций) позволяют обеспечить атомарный доступ.

Критическая секция (critical section) – это небольшой участок кода, требующий монопольного доступа к каким-то данным.

 

 

Основные объекты синхронизации

  • События (Event)
  • Ожидаемые таймеры (Waitable timer)
  • Семафоры (Semaphore)
  • Мьютексы (Mutex)

 

Wait-функция – это функция, позволяющая потоку в любой момент приостановить и ждать освобождение определенного объекта(ов) ядра.

Результаты работы Wait - функций

• Захват ожидаемого объекта

Возможность захвата во многом определяется типом объекта ядра

• Прекращение работы без захвата объекта

Когда необходимо определить момент времени освобождения объекта

 

17. Объект ядра «Событие». Понятие, назначение, примеры использования.

 

События (event) – самая примитивная разновидность объектов ядра, предназначены для уведомления об окончании какой-либо операции.

Типы событий:

  1. Со сбросом вручную (manual-reset events)

Захватываются вызовом отдельной функции

Позволяют возобновить выполнение сразу нескольких ждущих потоков

  1. С автосбросом (auto-reset events)

Захватываются сразу после ожидания

Возобновляют выполнение потока, который «первый» дождался события

 

Примеры использования:

• Создание

HANDLE CreateEvent( … ); // с указанием вида события

• Получение доступа (открытие)

HANDLE OpenEvent( … ); // необходимо знать имя

• Перевод в свободное состояние

BOOL SetEvent(HANDLE hEvent);

• Перевод в занятое состояние (захват)

BOOL ResetEvent(HANDLE hEvent);

 

18. Ожидаемые таймеры (waitable timer). Понятие, назначение, примеры использования.

 

Ожидаемые таймеры (waitable timer) – объекты ядра, которые самостоятельно переходят в свободное состояние в определенное время или через регулярные промежутки времени.

a. Всегда создается в занятом состоянии

b. Освобождается самостоятельно после своего срабатывания

c. Полезен при создании «планировщиков»

d. Может вывести машину из спящего режима

e. Можно использовать и при реализации коммуникационных протоколов

 

Типы таймеров:

− с автосбросом (auto-reset);

пробуждает лишь один из ждущих потоков

− со сбросом вручную (manual-reset).

пробуждает все ожидающие потоки

 

Ожидаемые таймеры

• Создание

HANDLE CreateWaitableTimer( … );

• Получение доступа (открытие)

HANDLE OpenWaitableTimer( … ); // необходимо знать имя

• Установка режима работы таймера

BOOL SetWaitableTimer( … ); // после создания таймера указывается время и частота срабатывания таймера.

  • Отмена ожидаемого таймера

BOOL CancelWaitableTimer(HANDLE hTimer); // Срабатывание таймера можно отменить, после чего он никогда не сработает, даже после его повторной переустановки.

 

19. Семафоры. Понятие, назначение, примеры использования.

 

Семафоры (semaphore) – объекты ядра, используемые для учета имеющихся ресурсов. Семафоры хранят два значения: максимальное количество ресурсов и счетчик свободных ресурсов.

 

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

 

Работа с семафорами

• Создание

  HANDLE CreateSemaphore( … ); // указывается максимальное число ресурсов

• Получение доступа (открытие)

  HANDLE OpenSemaphore(…);  // необходимо знать имя семафора

• Увеличение текущего числа ресурсов

  BOOL ReleaseSemaphore( … );

 

20. Мьютексы. Понятие, назначение, примеры использования.

 

Мьютексы (mutual exclusion, mutex) – объекты ядра, гарантирующие потокам взаимоисключающий доступ к единственному ресурсу

a. Содержат идентификаторы связанных потоков

b. Ведут себя также, как и критические секции, но:

  • Являются объектами ядра, а не пользовательского режима
  • Единственные позволяют синхронизовать доступ к ресурсу нескольких потоков из разных процессов; при этом можно задать максимальное время ожидания доступа к ресурсу.
Понятие API и WinAPI. Назначение WinAPI