    WIN32 API И ПОДДЕРЖИВАЮЩИ ЕГО ПЛАТФОРМЫ 

    глава 1 

    На конференциях мне часто задают один и тот же вопрос: «В чем разница 
между Win32, Win32s, Windows NT, Windows 95 и Windows CE?» Попробую здесь 
ответить — раз и навсегда. И, кстати, надо бы объяснить, почему в этой книге я 
сосредоточился исключительно на Windows NT и Windows 95. 

    Win32 API: мечты 

    Win32 — название интерфейса прикладных программ (application programming 
interface, API), не больше и не меньше. Так что Win32 API содержит 
совокупность функций, к которым может обращаться приложение. В таблице на рис. 
1-1 перечислены некоторые области применения функций этого API. 
    Win32 API реализован на четырех платформах: Win32s', Windows NT, Windows 
95 и Windows CE. Корпорация Microsoft стремилась включить все ^тЭ2-фун.кции во 
все платформы, поддерживающие интерфейс Win32 API. Это большое достижение для 
разработчиков программного обеспечения (нас с Вами) и не меньшее — для самой 
Microsoft. Для нас с Вами это означает, что тексты программ больше не придется 
переписывать для каждой платформы заново; теперь приложение достаточно 
перекомпилировать под другую платформу, и его уже можно передавать заказчику. 
А для Microsoft это означает, что существующие приложения смогут работать во 
всех ее современных операционных системах. 
    Конечно, Вам не терпится спросить: «А зачем нужны разные платформы Win32? 
Не логичнее ли иметь единственную платформу Win32 на все случаи жизни?» 
    Что ж, если бы мы жили где-нибудь в идеальном мире, я бы ответил на второй 
вопрос: «Да». Но давайте спустимся на землю. Одна платформа Win32 просто не в 
состоянии обеспечить все потребности. Почему дело обстоит именно так, я поясню 
в следующих четырех разделах, где мы познакомимся с платформами Win32 и 
узнаем, какую роль отводит каждой из них Microsoft в своей стратегии 
операционных систем. 
    1. К сожалению, в названии платформы Win32s тоже присутствует Win32, что 
только усугубляет путаницу. 

    2 ______________________________Windows для профессионалов 

    Атомы Печать 
    Ввод с клавиатуры и мышью Процессы и потоки 
    Время Регистрация событий 
    Графические примитивы Резервное копирование на ленточные носители 
    Динамически подключаемые библиотеки Ресурсы 
    Дочерние элементы управления Связь 
    Защита Сервисы 
    Каналы и почтовые ящики Сети 
    Консоли Системная информация 
    Мультимедийные сервисы Структурная обработка исключений 
    Операции с буфером обмена Управление окнами 
    Операции с реестром Управление памятью 
    Отладка Файлы 

    Рис. 1-1. Некоторые области применения Win32 API 


    Win32s 

    Win32s была первой платформой, способной выполнять \Ут32-прило:жения. 
Win32s состоит из набора DLL (dynamic-link libraries — динамически 
подключаемых библиотек) и драйвера виртуального устройства, дополняющего 
16-разрядную систему Windows З.х интерфейсом Win32 API. Таким образом, Win32s 
— не более чем 32-разрядная надстройка, или слой поверх обыкновенной 
16-разрядной Windows З.х Этот слой преобразует 32-битные параметры функций в 
16-битные и вызывает соответствующие функции 16-разрядной Windows. 
    В Win32s большинство Win32-фyнкций реализовано в виде заглушек: при их 
вызове тут же происходит возврат и ничего больше. Например, поскольку 
16-разрядная Windows не поддерживает потоков, функция, допустим CreateThread, 
возвратит нулевой описатель. Точно так же и все 'Wm'52-функ.ции, создающие 
некоторые объекты ядра, скажем события, возвратят нулевые описатели. Однако 
платформа Win32s все-таки расширяет некоторые возможности операционной системы 
— в ней, например, введена структурная обработка исключений и частично 
реализована поддержка проецируемых в память файлов (memory-mapped files). 
    Win32s создавалась, чтобы разработчики приступили к написанию 
32-разрядного кода еще до появления настоящих Win32-плaтфopм. При этом 
Microsoft рассчитывала пробудить интерес к программированию в Win32, чтобы к 
моменту выпуска Windows NT на рынке уже присутствовали 32-разрядные 
приложения. К сожалению, Win32s особого успеха не имела, и лично мне 
неизвестно, чтобы кто-то разрабатывал программное обеспечение специально для 
этой платформы. 

    Windows NT 

    Microsoft Windows NT — операционная система класса «high-end», вторая 
платформа, поддерживающая Win32. Windows NT — сравнительно новая операционная 
система, не отягощенная наследством MS-DOS. В Microsoft считают, что будущее 
операционных систем за этой архитектурой. Правда, Windows NT требует 
значительных объемов оперативной памяти и жесткого диска. А это значит, что 
среднестатическому пользователю для установки 

    Глава 1. Win32 API и поддерживающие его платформы   3 

    этой системы придется приобрести дополнительную память и более емкий 
жесткий диск. Но, судя по опыту многих «софтверных» компаний, заставить 
пользователя покупать оборудование ради перехода на новое программное 
обеспечение — дело весьма непростое. Вдобавок Windows NT 4.0 не 
предусматривает поддержки 80386-х машин и теперь требует минимум 80486-й процессор. 
    Windows NT — отказоустойчивая операционная система и даже некорректные 
приложения не способны привести ее к краху. Под некорректными приложениями я 
имею в виду программы, напрямую обращающиеся к оборудованию компьютера, 
например, к портам ввода/вывода. К сожалению, именно так и ведут себя многие 
программы MS-DOS и 16разрядной Windows. И когда Вы запустите любую из них в 
Windows NT, система немедленно завершит ее, как только та попытается напрямую 
обратиться к оборудованию. 
    По этим причинам (необходимые ресурсы и проблемы совместимости) объем 
продаж Windows NT пока ниже, чем предполагалось. И все же рано или поздно мы 
все перейдем на Windows NT — пусть даже этот переход растянется на несколько 
лет. А почему, спросите Вы, за Windows NT будущее? Рад, что Вы задали этот 
вопрос. Попробую ответить. 
    Во-первых, для Windows NT «родными» являются 32-разрядные приложения, 
которые используют все ее преимущества: мощь, отказоустойчивость и 
быстродействие. Более того. Windows NT способна выполнять сразу несколько 
разнотипных приложений, созданных для таких операционных систем, как OS/2 l.x, 
POSIX, Presentation Manager 2.x, MS-DOS и 16-разрядной Windows. 
    Во-вторых, Windows NT — переносимая (т. е. способная работать на машинах с 
разными типами процессоров) операционная система. (Большая часть Windows NT 
написана на С или C++.) Поэтому, чтобы Windows NT работала на MIPS R4000, DEC 
Alpha или Motorola PowerPC, Microsoft просто перекомпилирует исходный код 
операционной системы с помощью компилятора, «родного» для данного процессора, 
— вот Вам и версия Windows NT для нужной платформы. Но, конечно, перенос 
операционной системы на процессор с другой архитектурой не так прост. Для 
этого приходится переписывать 2 низкоуровневых компонента Windows NT 
Executive: ядро и HAL (Hardware Abstraction Layer — слой абстрагирования от 
оборудования). Эти компоненты пишутся на соответствующей версии языка 
ассемблера и весьма специфичны для конкретной архитектуры того или иного процессора. 
    После того как Microsoft переносит Windows NT на новую процессорную 
платформу, Вам остается лишь перекомпилировать свое Win32-пpилoжeниe — и, 
пожалуйста, оно тоже начинает работать на машине с другой архитектурой. Проще 
некуда! Я компилировал и тестировал все программы-примеры, включенные в книгу, 
на четырех платформах Windows NT: x86, MIPS, Alpha и PowerPC. Проделав такую 
операцию в первый раз, я даже изумился, насколько это легко. Теперь-то я 
привык и считаю это само собой разумеющимся. 
    Заметьте: Windows NT — единственная Win32-плaтфopмa, поддерживающая не 
только процессоры xS6. Иначе говоря, если Вы хотите, чтобы Ваши приложения 
работали и на MIPS, Alpha или PowerPC, используйте платформу Windows NT. Если 
же процессор Вашей машины — х86, можете выбирать из Win32s, Windows NT или 
Windows 95. Разумеется, Windows NT — самая мощная, но требует дополнительных 
затрат на модернизацию оборудования. 
    Третья из важнейших особенностей Windows NT — поддержка многопроцессорных 
машин. Работая на машине, скажем, с 4 процессорами, Windows NT позволяет 
одновременно выполнять до 4 потоков. А это значит, что компьютер получает 
возможность выполнить 4 задачи за время, необходимое для выполнения одной 
задачи на одном процессоре. Это невероятно мощное свойство Windows NT, но, как 
Вы и сами догадываетесь, машина с несколькими процессорами стоит подороже однопроцессорной. 

    4 ____________________________Windows для профессионалов 


    Windows 95 

    Пока Windows NT набирает силу, Microsoft выпустила Windows 95 — «народную» 
Win32платформу, долгожданную замену 16-разрядной Windows З.х, что, кстати, 
делает теперь платформу Win32s совершенно ненужной. Так что всерьез следует 
рассматривать лишь 3 платформы, поддерживающие Win32: Windows NT, Windows 95 и 
Windows CE. 
    В Windows 95 интерфейс Win32 API реализован полнее, чем в ее 
предшественнице, Win32s. Но все-таки не в полном объеме, как в Windows NT. 
Windows 95 заполняет на рынке очень емкую и стратегически значимую нишу: 386-е 
(и выше) машины с 4 и более мегабайтами памяти. Количество машин этой 
категории просто феноменально и, как ожидается, сохранится в ближайшие годы. 
Именно потому, что требования Windows NT к оборудованию чрезмерно высоки, 
Microsoft и выпустила платформу Windows 95. 
    Чтобы Windows 95 смогла работать на машинах с 4 Мб памяти, Microsoft 
пришлось урезать некоторые возможности Win32 API. В итоге Windows 95 не 
полностью поддерживает целый ряд 'Win32-функций, связанных в том числе с 
асинхронным вводом/выводом файлов, отладкой, реестром, защитой, регистрацией 
событий и т. д., — функции существуют, но реализованы частично. Однако, как 
это ни удивительно, Microsoft сумела «втиснуть» в Windows 95 значительную 
часть возможностей Win32 API и тем самым сделала ее весьма мощной операционной системой. 

    Windows СЕ 

    Windows CE — новейшая Win32-плaтфopмa от Microsoft. Она создана в связи с 
появлением новой техники и рассчитана главным образом на карманные 
вычислительные устройства, которые работают от аккумуляторов и не имеют ни 
жестких, ни гибких дисков. У большинства таких машин 2 или 4 Мб памяти, а 
отсутствие жесткого диска делает невозможным использование виртуальной памяти. 
Из-за столь жестких ограничений Microsoft пришлось создать совершенно новую 
операционную систему, даже менее требовательную к памяти, чем Windows 95. 
    Как ни странно, Windows CE гораздо мощнее MS-DOS и Windows 3.1. Она 
поддерживает проецируемые в память файлы, структурную обработку исключений, 
динамически подключаемые библиотеки, реестр, исполнение потоков с вытеснением 
и многое другое. Адресное пространство каждого процесса в ней тоже защищено от 
других выполняемых процессов. Кроме того, Windows CE — переносимая 
операционная система, в настоящее время способная работать на процессорах 
MIPS, SH3 и х86. 
    Хоть я особо и не рассматриваю Windows CE в этой книге, практически все 
концепции Win32 применимы и к данной платформе. Конечно, различия существуют и 
обычно проявляются там, где Windows CE накладывает ограничения на те или иные 
Win32^yHKции. В отдельных (очень редких) случаях Windows CE все же добавляет к 
концепциям и функциям Win32 нечто новое, пока недоступное на других 
Win32-плaтфopмax, поддерживая, в частности, уведомление пользователей, 
командные панели, файловые фильтры и управление простыми базами данных. Я не 
стану задерживаться на этих новинках, но в будущих книгах и статьях 
обязательно уделю им внимание. 

    __________Глава 1. Win32 API и поддерживающие его платформы   5 


    Win32 API: действительность 

    Платформы Win32s, Windows NT и Windows 95 — все они содержат 
Win32-d)yHKiii™, a значит, можно вызывать любую из функций интерфейса Win32 
API независимо от того, на какой именно платформе Вы работаете. Но реализация 
реализации рознь. Когда в Microsoft заявляют, что все \\[т32-функции будут 
реализованы на каждой платформе, на деле это означает, что все \Ут32-функции 
будут существовать на каждой платформе. Например, функция GreateRemote Thread 
существует на всех трех платформах: Win32s, Windows NT и Windows 95. Однако 
она создает удаленный поток, только если приложение вызывает ее на платформе 
Windows NT. Если процесс, выполняемый под управлением Win32s или Windows 95, 
обращается к CreateRemoteThread, она ничего не делает, а просто возвращает 
NULL, сообщая тем самым, что новый поток создать нельзя. 
    Причина такого ограничения в Win32s в том, что она всего лишь расширение 
16разрядной Windows З.х, реализующее большинство Win32-фyнкций простой 
переадресацией вызовов к функциям 16-разрядной Windows. Поскольку та не 
поддерживает создание новых потоков, Win32s ведет себя аналогично. Так что не 
забывайте: хотя в Win32s реализованы все Win32^yHKHHH, многие из них 
поддерживаются лишь частично. Ну а в Windows 95 удаленный поток нельзя создать 
по другой причине: эта функция требует от компьютера больших ресурсов памяти, 
и в Microsoft не сочли возможным вводить ее поддержку в операционной системе, 
предназначенной для работы на машинах даже с 4 Мб памяти. 
    Наверное, Вы заметили, что в предыдущих абзацах я ни словом не обмолвился 
о Windows СЕ. В этой операционной системе многие функции пришлось просто 
выкинуть изза чрезвычайно жестких ограничений. Например, в Windows СЕ нет 
функции CreateMutex, так как эта платформа не поддерживает объекты-мьютексы, и 
при компиляции исходного кода под Windows СЕ компилятор сообщит об ошибке, 
предупредив, что такая функция отсутствует. 
    Из-за этих ограничений не все приведенные в книге программы-примеры можно 
компилировать и запускать на любых Win32-плaтфopмax — типичное расхождение 
теории с практикой! Большинство функций, рассматриваемых здесь (относящихся, 
например, к программированию многопоточных приложений, управлению виртуальной 
памятью или операциям с проецируемыми в память файлами), полностью реализованы 
только на платформах Windows NT и Windows 95, с ограничениями — на Windows СЕ 
и лишь частично — на Win32s. Ввиду этого — если Вы хотите увидеть 
программы-примеры во всей, так сказать, красе — запускайте их либо в Windows 
NT, либо в Windows 95. 
    Более того, поскольку Win32s имеет столь ограниченные возможности, я даже 
не стал включать в книгу какие-либо материалы по этой платформе. Все, о чем 
идет речь в книге, относится исключительно к Windows NT и Windows 95. Если 
что-то из сказанного окажется верным и для Win32s, то, уверяю Вас, это чистая случайность. 
    И последнее. Готовя книгу, я старался обращать особое внимание на отличия 
реализации Win32 API в Windows 95 и Windows NT. Материалы такого рода я 
обводил рамками и, как показано ниже, помечал соответствующими значками — 
чтобы привлечь внимание читателей к каким-то деталям, характерным для той или 
иной платформы. 

    6 _______________________________Windows для профессионалов 

    wiNDowsX Здесь рассказывается об особенностях Windows 95. 
    NDowsX А тут говорится об особенностях Windows NT. 
    В том же духе я оформлял и те части текста, где содержатся сведения, 
нужные программистам для переноса приложений из 16-разрядной Windows на Win32, 
а также другие вещи, на которые стоит обратить внимание. 
    Так оформляется информация, необходимая при переносе приложений из 
16разрядной Windows на Win32. 
    А так выделяются важные примечания. 
