Windows Win32 API

До сих пор мы ориентировались в основном на UNIX. Теперь настало время взглянуть и на Windows. Операционные системы Windows и UNIX фундаментально отличаются друг от друга в соответствующих моделях программирования.
Программы UNIX состоят из кода, который выполняет те или иные действия, при необходимости обращаясь к системе с системными вызовами для получения конкретных услуг. В отличие от этого программой Windows управляют, как правило, события. Основная программа ждет, пока возникнет какое-нибудь событие, а затем вызывает процедуру для его обработки. Типичные события — это нажатие клавиши, перемещение мыши, нажатие кнопки мыши или подключение USB-диска. Затем для обслуживания события, обновления экрана и обновления внутреннего состояния программы вызываются обработчики. В итоге все это приводит к несколько иному стилю программирования, чем в UNIX, но поскольку эта книга посвящена функциям и структурам операционных систем, различные модели программирования не будут вызывать у нас особого интереса.

Разумеется, в Windows также есть системные вызовы. В UNIX имеется практически однозначная связь между системными вызовами (например, read) и библиотечными процедурами (с той же read), используемыми для обращения к системным вызовам. Иными словами, для каждого системного вызова обычно существует одна библиотечная процедура, чаще всего одноименная, вызываемая для обращения к нему (рис. 1.17). При этом в стандарте POSIX имеется всего лишь около 100 процедурных вызовов.

В системе Windows ситуация совершенно иная. Начнем с того, что фактические системные вызовы и используемые для их выполнения библиотечные вызовы намеренно разделены. Корпорацией Microsoft определен набор процедур, названный Win32 API (Application Programming Interface — интерфейс прикладного программирования). Предполагается, что программисты должны использовать его для доступа к службам операционной системы. Этот интерфейс частично поддерживается всеми версиями Windows, начиная с Windows 95. Отделяя API-интерфейс от фактических системных вызовов, Microsoft поддерживает возможность со временем изменять существующие системные вызовы (даже от одной версии к другой), сохраняя работоспособность уже существующих программ. Фактически в основу Win32 вносится некоторая неоднозначность, поскольку в самых последних версиях Windows содержится множество новых, ранее недоступных системных вызовов. В этом разделе под Win32 будет пониматься интерфейс, поддерживаемый всеми версиями Windows. Win32 обеспечивает совместимость версий Windows.

Количество имеющихся в Win32 API вызовов велико — исчисляется тысячами. Более того, наряду с тем, что многие из них действительно запускают системные вызовы, существенная часть целиком выполняется в пространстве пользователя. Как следствие, при работе с Windows становится невозможно понять, что является системным вызовом (то есть выполняемым ядром), а что — просто вызовом библиотечной процедуры в пространстве пользователя. Фактически то, что было системным вызовом в одной версии Windows, может быть выполнено в пространстве пользователя в другой, и наоборот. В этой книге при рассмотрении системных вызовов Windows мы будем использовать там, где это необходимо, процедуры Win32, поскольку Microsoft гарантирует, что с течением времени они не будут меняться. Но следует помнить, что не все они действительно являются системными вызовами (то есть обрабатываются ядром).

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

Если графическая подсистема работает в памяти ядра (что справедливо для некоторых, но не для всех версий Windows), то их можно отнести к системным вызовам, в противном случае они являются просто библиотечными вызовами. Следует ли рассматривать подобные вызовы в этой книге? Поскольку фактически они не относятся к функциям операционной системы, мы решили, что не следует, даже учитывая то, что они могут выполняться ядром. Тем, кто заинтересуется Win32 API, следует обратиться к одной из многочисленных книг на эту тему (например, к книгам Hart, 1997; Rector and Newcomer, 1997; Simon, 1997).

Даже простое перечисление на этих страницах всех вызовов Win32 API выходит за рамки нашей тематики, поэтому мы ограничимся только теми, которые по своим функциональным возможностям можно приблизительно сопоставить с системными вызовами UNIX, перечисленными в табл. 1.1. Их список представлен в табл. 1.2.

Давайте коротко поговорим об этом списке. Вызов CreateProcess создает новый процесс. В нем совмещается работа UNIX-вызовов fork и execve. Множество параметров этого вызова определяют свойства вновь создаваемого процесса. В Windows отсутствует иерархия процессов, присущая UNIX, поэтому понятия родительского и дочернего процессов здесь не используются. После создания процесса процесс-создатель и вновь созданный процесс становятся равноправными. Вызов WaitForSingleObject используется для ожидания события. Ожидание может касаться множества возможных событий. Если в параметре указан процесс, то вызывающая программа дожидается окончания конкретного процесса. Завершение работы процесса происходит при использовании вызова ExitProcess.

Таблица 1.2. Вызовы Win32 API, приблизительно соответствующие вызовам UNIX, перечисленным в табл. 1.1. Следует заметить, что в Windows имеется очень большое количество других системных вызовов, большинство из которых не имеют соответствий в UNIX


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

Вызовы SetFilePointer и GetFileAttributesEx устанавливают позицию указателя файла и получают некоторые из атрибутов файла.

В Windows также имеются каталоги, которые создаются и удаляются вызовами CreateDirectory и RemoveDirectory соответственно. Здесь тоже имеется понятие текущего каталога, который устанавливается вызовом SetCurrentDirectory. Для получения текущего времени используется вызов GetLocalTime.

В интерфейсе Win32 отсутствует поддержка связанных файлов, подключаемых файловых систем, защиты файлов, сигналов, поэтому отсутствуют и вызовы, соответствующие тем, что есть в UNIX. Разумеется, в Win32 есть огромное количество других вызовов, которых нет в UNIX, особенно относящихся к графическому пользовательскому интерфейсу. Windows Vista имеет усовершенствованную систему защиты, а также поддерживает связанные файлы[8]. А в Windows 7 и 8 добавлено еще больше свойств и системных вызовов.

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

1.7.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Windows Win32 API:

  1. М.Руссинович, Д.Соломон. Внутреннее устройство Microsoft Windows (главы 1–4), 2005
  2. Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ, 2015
  3. МТБ
  4. Кудинов Ю. И., Пащенко Ф. Ф., Келина А. Ю.. Практикум по основам современной информатики: Учебное пособие., 2011
  5. Ю. И. КУДИНОВ, Ф.Ф. ПАЩЕНКО, А. Ю. КЕЛИНА. ПРАКТИКУМ ПО ОСНОВАМ СОВРЕМЕННОЙ ИНФОРМАТИКИ, 2011
  6. Г.С.Иванова, Т.Н.Ничушкина, Е.К.Пугачев. Объектно- ориентированное программирование, 2001
  7. Уран и Плутон,
  8. Иллюстрация
  9. Многоуровневость сознания в ее корреляции с многоуровневостью нервной системы
  10. Если телевизор, то XXX