Системное программирование в среде Win32

Автор работы: Пользователь скрыл имя, 25 Марта 2014 в 14:49, лекция

Краткое описание

Конспект лекций содержит описание технологии системного программирования под Windows с использованием функций Win32 API. В первой части конспекта лекций рассмотрены особенности архитектуры ОС Windows, специфика интерфейса прикладного программирования Win32, структура приложений для Windows. Подробно рассмотрены API функции и основные структуры данных для работы с дисками, каталогами, файлами. Отдельная глава посвящена структурной обработке исключений SEH.

Прикрепленные файлы: 1 файл

Win32_лек_часть1.doc

— 811.00 Кб (Скачать документ)

Наконец, Windows обеспечивает более полное использование оперативной памяти и многозадачность. 

 

Win32 и Windows 2000, NT, 9x и CE

Существование нескольких различных 32-разрядных операционных систем Windows может сбить с толку. Но, с точки зрения программиста, они похожи. В частности, все они поддерживают один и тот же API Win32. Программы, разработанные для одной системы, могут, с известными оговорками, работать на другой; обеспечивается совместимость по исходному коду и в большинстве случаев двоичная совместимость.

Для простоты будем использовать термины «2000/NT» и «9х», когда нет необходимости указывать на различия. Включая СЕ, мы будем иметь только три, а не пять основных членов семейства Win32.

Охарактеризуем коротко каждую из этих ОС.

Ядро Windows 2000

Windows 2000 –  это операционная система класса  «high-end». Список ее особенностей  и возможностей занимает ни  одну страницу. Вот лишь некоторые из них:

  • Отказоустойчива. Плохо написанные программы не могут привести к краху системы.
  • Защищена. Несанкционированный доступ к ресурсам (например, файла, принтерам), управляемым этой системой, невозможен.
  • Богатый набор средств и утилит для администрирования системы в масштабах предприятия.
  • Ядро Windows 2000 написано в основном на С и С++, поэтому система легко переносится на процессоры с другими архитектурами.
  • Полностью поддерживает Unicode, что упрощает локализацию и работу с использованием различных языков.
  • Имеет высокоэффективную подсистему управления памятью.
  • Поддерживает структурную обработку исключений (structured exception handling, SEH), облегчая восстановление после ошибок.
  • Позволяет расширять функциональность за счет динамически подключаемых библиотек (DLL).
  • Поддерживает многопоточность и мультипроцессорную обработку.
  • Файловая система Windows 2000 дает возможность отслеживать, как пользователи манипулируют данными на своих машинах.

  Ядро Windows 98

Windows 98 –  операционная система потребительского  класса. Она обладает многими  возможностями Windows 2000, но некоторые  ключевые из них не поддерживает. Так, Windows 98, не относится к числу отказоустойчивых (приложение вполне способно привести к краху системы), поддерживает Unicode лишь частично. Однако Windows 98 более дружелюбна к пользователю, чем Windows 2000. 

Ядро Windows СЕ

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

 

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

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

1.4. Особенности  Win32 API

Существует несколько основных принципов Win32, которые следует запомнить.

  • Почти каждый системный ресурс – это объект ядра. В исполнительной системе объект (object) – это отдельный образец статически определенного типа объектов, существующий во время выполнения. Тип объектов, иногда называемый классом объектов, включает определенный системой тип данных, объектные сервисы, работающие с образцами этого типа, и набор атрибутов объекта. Атрибут объекта – это поле данных внутри объекта, частично определяющее его состояние. Объектные сервисы – способы манипулирования объектами – обычно считывают или изменяют  атрибуты объектов. Windows использует объекты для унификации представления и управления системными ресурсами. Каждый системный ресурс, который могут совместно использовать несколько процессов, такой, как файл, память или физическое устройство, реализован как объект и обрабатывается объектными сервисами. Доступ ОС к ресурсам и работа с ними унифицированы. Создание, удаление и ссылка на объект осуществляется с использованием дескрипторов (handle, хэндл) объектов. Дескрипторы присваиваются чему угодно – окну, курсору, кнопке, процессу, потоку и т.п. Фактически дескриптор – это указатель на блок памяти, в котором размещен тот или иной объект. В заголовочных файлах тип HANDLE определен как  void*. Контроль использования ресурсов сводится  к отслеживанию создания и использования объектов. Для всех объектов контроль доступа к ним осуществляется одинаково с помощью подсистемы защиты. Два процесса совместно используют объект тогда, когда каждый из них открыл его дескриптор. ОС может отслеживать количество дескрипторов, открытых для данного объекта, чтобы определить, действительно ли он все еще используется, и может удалить объекты, которые более не используются.

 

  • Объектами ядра должен управлять API Win32. Нет никаких «обходных путей». Это условие соответствует принципам абстракции данных в объектно-ориентированном программировании, хотя Win32 не является объектно-ориентированным.

 

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

 

  • Win32 – богатый и гибкий интерфейс. Во-первых, он содержит множество функций, выполняющих подобные действия; в частности, «функции-полуфабрикаты» (convenience functions) объединяют в одной функции часто применяемые последовательности вызовов функций. Во-вторых, функции обычно имеют многочисленные параметры и флаги, многие из которых игнорируются.

 

  • Win32 содержит разнообразные механизмы синхронизации и взаимодействия, специализированные для различных требований.

 

  • В отличие от UNIX, основным модулем выполнения Win32 является не процесс, а поток. Процесс может содержать один и более потоков.

 

  • Функции Win32 имеют длинные описательные имена, например, WaitForSingleObject. При составлении имен использована так называемая венгерская нотация (автор – один из первых разработчиков Windows Чарльз Симонаи, венгр по происхождению). Суть: каждое слово в имени пишется с прописной буквы и слитно с другими словами; каждый идентификатор предваряется несколькими строчными буквами, определяющими его тип. Такие имена, как правило, уже дают некоторую  информацию о назначении и особенностях функции.

 

  • Имена стандартных типов данных, требуемых для API, состоят из символов верхнего регистра и также описательны. Например: BOOL (определен как 32-разрядный объект для хранения одиночного логического значения), DWORD (самый распространенный 32-разрядный целочисленный беззнаковый тип), LPTSTR (указатель на строку из 8- или 16—разрядных символов).

 

  • Для стандартных типов данных не применяется оператор * (доступ по указателю).

 

  • Имена переменных, по крайней мере, в прототипах функций также подчиняются соглашениям.  Например: fdwAccess – двойное слово (32 бита), содержащее флаги доступа к файлу; fdw означает флаги в двойном слове (flags in a double word).

 

Хотя Win32 был разработан, что называется, «с нуля», он обладает обратной совместимостью с API Win16 для Windows 3.1. Некоторые последствия этого факта могут быть непонятны с точки зрения «32-разрядного» программирования. Например:

  • Анахронизмы в именах типов, таких как: LPTSTR  или LPDWORD, где   LP означает «длинный указатель» (long pointer), а на самом деле 32-разрядный указатель. Никакой другой тип указателя не нужен и не используется. В других случаях «long» опускается, и типы  LPVOID и PVOID эквивалентны.
  • Обратная совместимость означает, что в API имеются многочисленные, 16-разрядные функции, которые могут и не использоваться, так как имеют соответствующие аналоги в Win32. Например, функция OpenFile (открытие файла); в Win32 для открытия файла обычно используется функция  CreateFile.

 

1.5. Windows - система, управляемая сообщениями

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

В отличие от традиционного последовательного программирования, программирование для Windows является объектно-ориентированным. Система Windows представляет собой набор объектов, именно с ними приходится сталкиваться при программировании.

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

Все сообщения, источником которых служат аппаратные средства, система помещает в определенную структуру данных – первичную входную очередь (raw input queue).

Что значит послать окну сообщение? Это значит записать определенную информацию о каком-либо событии в область памяти, доступную оконной процедуре. Эта область памяти, вмещающая несколько сообщений, действует по принципу стека FIFO (First Input – First Output) и называется очередью программы. В свою очередь, приложение тоже вызывает систему не на прямую, а посылая сообщения системе. Следовательно, существует одна общесистемная очередь сообщений и очереди сообщений у каждого окна.

 

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

Напротив, в 32-разрядных операционных системах Windows 95 и Windows NT реализован метод поддержки отдельных очередей сообщений, который называется десинхронизацией вывода (input desynchronization), при котором новые сообщения лишь ненадолго попадают в первичную входную очередь, после чего перенаправляются в частную очередь конкретного потока 32-разрядного приложения. В самом начале своей работы 32-разрядное приложение обладает единственной очередью сообщений, которая относится к его первичному потоку. В случае если процесс заводит еще один поток, система не создает еще одну очередь немедленно. Дополнительная очередь создается только после того, как второй поток данного приложения впервые направляет в систему относящийся к очереди запрос. Если потоку очередь сообщений не нужна, система не тратит ресурсы на ее создание.

 

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

Что делать с полученным сообщением? Каждое окно Windows имеет специальную функцию, которая вызывается для обслуживания сообщений. Операционная система только посылает сообщение окну, а оно уже само решает, что делать с этим сообщением. Точнее, программист должен «научить» окно, как отвечать на получаемые сообщения. На всем протяжении этого процесса окно действует как автономный объект, живущий своей собственной жизнью.

Следует сказать, что Windows API в своем составе имеет одну очень важную функцию. Эта функция SendMessage. Ее основная задача – послать сообщение некоторому объекту (возможно, с дополнительными данными), дождаться реакции объекта на это сообщение, обычно в виде числа, которое и вернуть системе. При этом объектом может быть не только окно приложения, но и любой элемент управления, например, кнопка. Сообщение, передаваемое с помощью этой функции, практически немедленно обрабатывается оконной процедурой, т.к. последняя получает сообщение не из очереди, а напрямую. При этом приложение дожидается окончания обработки посланного сообщения.

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

 

1.6. Контекст устройства

С точки зрения программиста, Windows является системой, не зависящей от устройств (device independent). Эту независимость обеспечивает библиотека GDI32.dll, а со стороны устройства – драйвер этого устройства. Например, если приложение осуществляет вывод в область пользовательского окна дисплея, это библиотека VGA.dll, если на принтер Epson FX-80, то это библиотека – EPSON9.dll.

Перед операцией вывода на некоторое устройство приложение должно запросить GDI (Grafics Device Interface — интерфейс графических устройств) о загрузке соответствующего драйвера (обычно это происходит автоматически и не требует от программиста дополнительных усилий). Как только драйвер загружен, приложение может настроить ряд параметров вывода (цвет линии, кисти, шрифт и т.д.). Windows обеспечивает хранение этих и других параметров в специальной структуре, называемой контекстом устройства (Device Context – DC).

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

Информация о работе Системное программирование в среде Win32