    Advanced Windows 
    Third Edition 
    Jeffrey Richter 
    Microsoft Press 
    
    
    УДК 681.3.06 ББК 32.973-018.2 
    Р558 
    Рихтер Дж. 
    Р558 Windows для профессионалов: Программирование для Windows 95 и Windows 
NT 4 на базе Win32 API/Пер. с англ. — М.: Издательский отдел «Русская 
Редакция» ТОО «Channel Trading Ltd.», 1997. - 712 с.: ил. 
    ISBN 5-7502-0046-9 
    Эта книга (третье, дополненное и переработанное издание) посвящена 
программированию для Windows NT 4 и Windows 95 с использованием функций Win32 
API. Состоит из введения, 18 глав, трех приложений и предметного указателя. 
Ориентирована на профессиональных программистов, владеющих языком С и имеющих 
опыт разработки приложений для 16-разрядной Windows. По сравнению с 
предыдущими изданиями книга дополнена описанием новых функций, появившихся в 
Windows NT 4, уточнены материалы, относящиеся к Windows 95, рассмотрены 
объекты ядра, новые синхронизирующие объекты, порты завершения ввода/вывода, а 
также механизм волокон, предназначенный для переноса UNIX-приложений в Windows NT. 
    Это не только справочник по функциями Win32 API, но и прекрасный учебник 
по программированию многопоточных приложений в 32-разрядных операционных 
системах Windows NT 4 и Windows 95. Прилагаемый компакт-диск содержит все 
программы из книги (исходные тексты и исполняемые файлы для процессоров Intel 
x86, MIPS, DEC Alpha и PowerPC), мультимедийные демонстрационные материалы, а 
также материалы, любезно предоставленные Microsoft A. 0. 
    Оригинальное издание на английском языке, Джеффри Рихтер, 1997 Русский 
перевод, Microsoft Corporation, 1997 
    Подготовлено к печати издательским отделом «Русская Редакция» ТОО «Channel 
Trading Ltd.» по лицензионному договору с Microsoft Corporation, Редмонд, 
Вашингтон, США. 
    Microsoft, MS-DOS, Windows, Visual C++ и Windows NT являются 
зарегистрированными торговыми знаками Microsoft Corporation. Все другие 
товарные знаки являются собственностью соответствующих фирм. 
    ISBN 1-57231-548-2 (англ.) ISBN 5-7502-0046-9 


    ВВЕДЕНИЕ 

    Я получил большое удовольствие, готовя эту книгу. Для меня нет ничего 
приятнее, чем быть на переднем крае технологии и учиться чему-нибудь новому. 
Windows 95 и Windows NT — это действительно передний край технологии, и тут 
(будьте спокойны!) есть, чему поучиться. Но пусть это Вас не пугает. Если Вы 
уже программируете для 16-разрядной Windows, Вы убедитесь, что к написанию 
Win32-приложений можно приступить, освоив всего несколько несложных приемов, 
необходимых для переноса существующего кода. Однако в таких программах Вам, 
конечно, не удастся воспользоваться преимуществами новых, мощных и просто 
потрясающих функций, заложенных в 32-разрядную среду операционных систем 
Windows 95 и Windows NT. 
    Если Вы переходите на Windows NT с других операционных систем (например, 
UNIX), моя книга поможет Вам извлечь максимум из возможностей, которыми так 
богата эта система. Ведь одно дело подогнать существующее приложение под 
Windows NT и совсем другое — создать его версию, «родную» для Windows NT. А 
этой операционной системе есть что предложить. Просто заставив свое приложение 
работать и в Windows NT, на особые лавры лучше не рассчитывать. Если же Вы 
серьезно переделаете свою программу — так, чтобы она действительно получала 
выигрыш от функциональных особенностей Windows NT, — уверен, Вы серьезно 
сократите существующий код и, повысив быстродействие программы, снизите ее 
потребности в памяти. 
    Начав работать с Win32, Вы сможете постепенно включать в приложения все 
большее число его функций. И многие из них здорово упростят написание 
программ. Я сам прочувствовал это, как только перенес в Win32 часть своих 
программ: представляете, я просто выбросил огромные куски кода, заменив их на 
вызовы функций, встроенных в Win32. 
    Они так удобны, что я полностью перешел на программирование в Win32, а на 
конференциях (да и просто в компаниях) стараюсь почаще объяснять, насколько 
эффективна разработка приложений в Win32. В общем, эта книга поможет Вам 
подготовиться к разработке приложений для среды, которая обязательно будет 
промышленным стандартом. 

    Несколько слов о программах-примерах 

    Программы-примеры наглядно продемонстрируют способы использования новейших 
Win32^yHKHH^ Никакие, даже самые пространные объяснения не заменят знаний и 
опыта, приобретенных при написании собственных приложений. Я проверил это на 
себе, изучая Win32. Многие примеры этой книги — прямые потомки 
экспериментальных программ, которые я составлял, пытаясь разобраться, как 
ведут себя \Ут32-функции. 

    xxii ._____________________________Windows для профессионалов 


    Программы, написанные на С 

    Когда пришла пора выбирать язык для написания программ-примеров, я долго 
колебался между С и C++. В крупных проектах я всегда использую C++, но многие 
программисты, пишущие для Windows, пока еще редко работают на этом языке, — 
вот я и решил не отсекать потенциально широкую «аудиторию» и выбрал С. 

    Макросы — распаковщики сообщений 

    Если Вы разрабатываете '\Уш32-приложения не на C++ и не используете 
библиотеку классов (например, MFC), настоятельно рекомендую применять макросы 
— распаковщики сообщений (message cracker macros), определенные в заголовочном 
файле WINDOWSX.H. Они заметно облегчают написание, чтение и поддержку 
программ. Я проникся к ним такими сильными чувствами, что включил их в 
приложение А; там Вы узнаете, для чего эти макросы нужны и как ими эффективно пользоваться. 

    Умение программировать в 16-разрядной Windows 

    Ни одна из приведенных в книге программ не потребует от Вас обширных 
познаний в области программирования для 16-разрядной Windows, но, если они у 
Вас есть, это несомненный плюс. А что действительно необходимо, так это уметь 
создавать и обрабатывать диалоговые окна и их элементы управления. Желательно 
иметь хотя бы начальное представление о функциях GDI и ядра. 
    Я старался проводить сравнения между 16-разрядной Windows и Win32, где 
только можно. Зная особенности функций 16-разрядной Windows, легче понять, как 
изменилось их поведение в Win32. 

    Выполнение программ-примеров в Windows 95 

    Windows 95 способна работать на компьютерах с 4 Мб оперативной памяти. 
Чтобы добиться этого, Microsoft пришлось при создании Windows 95 внести 
кое-какие упрощения. Для разработчика программного обеспечения это означает, 
что некоторые 'Win52-функции не полностью реализованы в Windows 95. Сказанное 
прямо относится и к программам-примерам: весь круг возможностей некоторых из 
них доступен только под управлением Windows NT. Из-за ограничений, присущих 
Windows 95, следующие программы работают только в Windows NT: ALERTIO.EXE 
(глава 15), IOCMPPRT.EXE (глава 15), TINJLIB.EXE (глава 18) и COUNTER.EXE 
(приложение А). О причинах я расскажу, когда дело дойдет до этих программ. 

    «Посторонний» код 

    Я стремился удалять из программ-примеров любой код, не имеющий прямого 
отношения к демонстрируемым приемам. К сожалению, это практически невозможно 
при написании Windows-программ. Скажем, в большинстве книг по программированию 
для Windows в каждом приложении повторяется код, необходимый для регистрации 
оконных классов. 
    Некоторые приемы, к которым я прибегал для сокращения «постороннего» кода, 
не всегда очевидны Windows-программисту. Например, пользовательский интерфейс 
в большинстве программ-примеров — это диалоговое окно, и, по сути, в таких 
программах достаточно включить в WinMain всего одну строку кода, из которой 
просто вызывается фун

    Введение xxiii 

    кция DialogBox. В результате ни одна из программ-примеров не 
инициализирует структуру WNDCLASS и не обращается к функции RegisterClass. 
Более того, лишь в двух примерах — FileChng (глава 4) и Counter (приложение А) 
— присутствуют циклы выборки сообщений (message loop). 

    Независимость программ-примеров 

    Я старался сохранить независимость программ-примеров друг от друга. 
Допустим, глава 8, посвященная проецируемым в память файлам (memory-mapped 
files), — единственная, в которой есть примеры, построенные на использовании 
этих файлов. И поскольку структура программ-примеров такова, что они 
совершенно независимы, можно спокойно пропускать какие-то главы и изучать лишь 
то, что интересно на данный момент. 
    Иногда будут попадаться примеры, в которых используются приемы или 
информация из предыдущих глав. Так, приложение SEHExcpt (глава 16), связанное 
со структурной обработкой исключений (structured exception handling, SEH), 
демонстрирует и принципы обращения с виртуальной памятью. Эти две темы я решил 
совместить в одном примере потому, что структурная обработка исключений — 
очень полезный механизм для манипуляций с виртуальной памятью. Так что, если 
Вы хотите хорошенько разобраться в данной программе-примере, придется сначала 
прочесть главы 5, 6 и 7. 
    Но есть одна программа-пример, в которой — что называется «с миру по 
нитке» — используется практически все, о чем рассказано в книге: это TInjLib 
из главы 18. Чтобы в ней разобраться, нужно иметь четкое представление об 
объектах ядра, виртуальной памяти, процессах, потоках, их синхронизации, 
динамически подключаемых библиотеках, структурной обработке исключений и 
Unicode. Я бы даже сказал так: если Вы полностью понимаете программу TInjLib, 
значит, Вы готовы к сдаче экзамена по программированию в Win32. 

    Макрос STRICT 

    Все приложения рассчитаны на компиляцию с определенным макросом STRICT, 
что позволяет отлавливать часто встречающиеся ошибки в коде. Например, при 
определенном STRICT передача в функцию описателя неверного типа обнаруживается 
не в период выполнения, а еще на этапе компиляции. Подробнее об использовании 
STRICT см. документацию Programming Techniques из Win32 SDK. 

    Контроль ошибок 

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

    Есть ли в примерах «жучки»? 

    Я был бы счастлив заявить, что мои программы свободны от «жучков». Но я, 
как и Вы, прекрасно понимаю, что любой программный продукт считается 
безошибочным лишь до тех пор, пока кто-нибудь не обнаружит этих «насекомых». 
Конечно, я несколько раз «прошелся» по всему коду в надежде что-нибудь 
выловить. Если Вы все же найдете «жучка», буду рад получить от Вас сообщение 
через Internet по адресу: v-jeffrr@microsoft.com. 

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


    Платформы и среды, в которых тестировались программы 

    Основной объем исследований и разработка программ для этой книги проведены 
на машине с двумя процессорами Intel Pentium. Кроме того, я перекомпилировал и 
проверил все программы-примеры на MIPS и DEC Alpha, используя компиляторы и 
компоновщики, поставляемые для этих платформ в комплекте Visual C++ 4.0. Все 
программы протестированы в Windows 95 и Windows NT. 
    Некоторые приложения используют новые функции, появившиеся в Windows NT 4. 
Поскольку Visual C++ версий 4.х поставляли до выхода Windows NT 4, в его 
заголовочных файлах отсутствуют прототипы некоторых новых функций, и это 
помешает собрать отдельные программы-примеры. Чтобы решить эту проблему, 
замените заголовочные файлы, поставляемые с Visual C++, на те, что входят в 
состав Win32 SDK. 
    В большинстве программ-примеров я не использовал расширений компиляторов, 
специфичных для конкретных платформ. Ведь нужно иметь возможность 
компилировать и компоновать эти программы независимо от процессора и от 
применяемых инструментальных средств. 
    Однако в нескольких программах все-таки реализованы преимущества 
специфических расширений некоторых компиляторов: 
    • Именованные разделы данных с синтаксисом: 

    #pragma data_seg (...) 

    • Статическая локальная память потока с синтаксисом: 

    __declspec(thread) 

    • Структурная обработка исключений с применением ключевых слов: 

    __try, __leave, __finally, „except 

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

    __declspec(dllimport) и __declspec(dllexport) 

    Если Вы применяете какие-то инструментальные средства, не включенные в 
состав Visual C++ 4.0, придется разбираться в том, как они реализуют указанные 
функции, и соответственно модифицировать тексты программ. 

    Unicode 

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

    __________._______________________________ Введение xxv 

    легко догадаться, что они делают, — если хорошо знать аналогичные функции 
из стандартной библиотеки С. Ну а если Вы зашли в тупик, обратитесь к главе 
17. Там об этом говорится намного подробнее. Я очень надеюсь, что Вас не 
смутят новые функции, работающие с символами и строками, и что Вы убедитесь, 
как легко и просто составлять программы с использованием Unicode. 

    Установка программ-примеров 

    CD-ROM-диск, которым комплектуется эта книга, содержит исходный код всех 
программпримеров. Кроме того, в него включены ЕХЕ- и DLL-файлы для xS6-, 
MIPS-, Alpha AXP- и PowerPC-версий этих программ. Поскольку ни одна из 
программ не сжата, Вы можете просто копировать нужные исходные файлы, а 
исполняемые — запускать прямо с CD-ROM-диска. 
    В корневом каталоге CD-ROM-диска содержатся установочные средства, 
заголовочный файл CMNHDR.H (о нем см. приложение В) и два-три десятка 
подкаталогов. Четыре из них называются X86.BIN, MIPS.BIN, ALPHA.BIN и 
POWERPC.BIN. В этих подкаталогах Вы найдете ЕХЕ- и DLL-файлы для 
соответствующих процессорных платформ. Даже работая в Windows NT на другой 
платформе (отличной от х86, MIPS, Alpha или PowerPC), Вы все равно получите 
доступ к файлам с исходным кодом, но ни одну программу Вы не сможете запустить 
до тех пор, пока не соберете ее сами. Иными словами, в этом случае Вам 
придется самостоятельно установить на свой жесткий диск нужные файлы с 
исходным кодом. 
    Остальные подкаталоги содержат файлы с исходным кодом программ-примеров. 
Каждое приложение размещено в своем подкаталоге. Имя подкаталога идентично 
названию программы-примера. 
    Чтобы просмотреть код отдельных программ (или запустить их), копировать 
что-то на жесткий диск нет никакой необходимости. Однако модификация или 
компиляция любого примера требует предварительного копирования соответствующих 
файлов на жесткий диск. Способ доступа к ним зависит от операционной системы, 
в которой Вы работаете (Windows 95 или Windows NT). Но об этом — в следующем разделе. 

    CD-ROM-диск, прилагаемый к книге 

    В Windows 95 и Windows NT 4 вставка CD-ROM-диска в привод автоматически 
запускает программу Welcome. Она позволяет просматривать содержимое диска. 
    В этой программе Вы можете использовать кнопки, описанные в таблице: 

    Кнопка           Описание 

    Introduction        Заставляет меня рассказывать, о чем эта книга. 
    Video demos       Проигрывает AVI-файлы, в которых я поясняю, что именно 
демонстрирует каждая программа-пример и как ею пользоваться. 
    Setup             Копирует файлы с исходным кодом и соответствующие 
исполняемые файлы на жесткий диск Вашего компьютера. 
    Explorer           Открывает окно Explorer со списком исполняемых файлов. 
Отсюда можно запустить любую из перечисленных программ. 
    Credits            Показывает список лиц, помогавших мне в подготовке этой 
книги. Training           Нахальная самореклама собственных учебных семинаров. 
    В Windows NT 3.51 (и более ранних версиях) Вам придется самостоятельно 
загрузить программу Welcome, запустив файл Welcome.bat из корневого каталога CD-ROM-диска. 

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

    Компакт-диск, прилагаемый к русскому изданию книги, дополнен материалами, 
любезно предоставленными Московским представительством корпорации Microsoft — 
Microsoft A. 0.: 
    • Service Pack 3 для Windows NT 4 (для русской и английской версий); 
    • Internet Information Server 3; 
    • Service Pack 1 и обновление OLE32 для Windows 95 (для русской и 
панъевропейской версий); 
    • пакет исправлений для русских версий Microsoft Word 95, Excel 95 и 
PowerPoint 95. 


    ОТ АВТОРА 
    Моей матери, Арлин, сумевшей мужественно и бесстрашно пережить самый 
трудный и мучительный период жизни. Твоя любовь и поддержка сделали меня тем, 
кем я стал. Где бы я ни был, ты всегда со мной. 
    — Со всей любовью, Джефф 
    Сьюзан Кьюберт Рейми, доказавшей мне, что не компьютеры — центр Вселенной. 
    — Дж. «Би-Би-Би» Р. 
    Лотя на обложке указана только моя фамилия, в создание этой книги в той 
или иной форме вложен труд многих. Одни — и их большинство — мои добрые друзья 
(время от времени мы вместе ходим в кино или обедаем); с другими я не знаком 
лично и общался только по телефону или электронной почте. Мне никогда не 
удалось бы закончить книгу без их помощи и поддержки — спасибо всем. Вот эти люди. 
    Сьюзан «Кью» Рейми (Susan «Q» Ramee) не переставала любить и лелеять меня, 
пока я занимался своей книгой. Кроме того, Сью проверила корректуру и 
вдохновила меня на несколько идей для программ-примеров. Ну и, конечно, 
выражая благодарность Сью, нельзя не сказать спасибо и двум ее кошкам, Нэт и 
Кэтоу. Частенько, далеко за полночь, когда я не мог заснуть и садился за 
компьютер, Нэт и Кэтоу присоединялись ко мне. В самый разгар работы они то 
садились на мои заметки, то расхаживали по клавиатуре. Так что все апичатки в 
етой хниге толька из-жа них, я тут ни при чем, честное слово. 
    Джим Харкинс (Jim Harkins) — один из моих лучших друзей. Стоит мне только 
подумать о Джиме, я сразу же так и слышу его слова: «А когда ты в последний 
раз хлорировал джакуззи?» Наверное, мало кто знает, что Джим — автор 
популярной и страшно веселой игры «Guess What The Plant Said?» Его прямой 
вклад в мою книгу Вы обнаружите в программах-примерах Directory Walker, 
Alertable File I/O и File Change. Джим помог мне разобраться в вопросах, 
связанных с синхронизацией потоков, и придумать независимую от типа процессора 
версию InjectLib. 
    Скотт Людвиг (Scott Ludwig) и Валери Хорват (Valerie Horvath) стали моими 
близкими друзьями. Мы часто ходили на фильмы, в которых все взрывается и 
рушится. Вдобавок Скотт и Валери познакомили меня с миром профессионального 
баскетбола (как они играли, эти «Гарлемские Бродяги»!). Скотт был в Microsoft 
ведущим разработчиком первой версии Windows NT, и, когда я готовил еще первое 
издание этой книги, он проявил редкостное терпение, отвечая на мои вопросы. 
Подолгу беседуя с этим человеком, я проникся к нему искренним уважением. 

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

    Люси Гудинг (Lucy Gooding) сделала мою жизнь чуточку острее (по большей 
части, это был чеснок) и заслужила медаль за то, что столько времени терпела 
мой «резиновый» рабочий день. 
    С Джонатаном Локом (Jonathan Locke) мы нашли общие интересы в музыке, но 
почему-то машины 386/25 МГц ему милее быстродействующих MIPS. Джонатан помог 
мне с проверкой многих глав книги, норовя временами исковеркать текст и 
изменить его смысл. Порой его предложения заводили нас в такие дебри, что руки 
опускались. Но в конце концов мы сумели более или менее внятно подать этот материал. 
    Кейт Плиз (Keith Pleas) и я — мы жили как бы параллельно и в последние 
несколько лет стали хорошими друзьями. Оба в один и тот же день купили по 
столу для пин-понга, и у нас одни и те же беспроводные наушники, а сейчас мы 
только и говорим, что о «Запахе Женщины» («Scent of a Woman»). 
    Джефф Куперстайн (Jeff Cooperstein) — один из моих друзей — умеет 
испортить любую систему и заставить ее делать как раз то, что, по замыслам 
разработчиков, она делать ни в коем случае не должна. Джефф придумал несколько 
способов, как обойти защиту Windows NT (в версии 3.5 его фокусы учли), и 
теперь подумывает, не создать ли VDK (Virus Development Kit). А прославился он 
своим советом: «Что зависла? Так отключи сетевой кабель, машина пропустит 
широковещательный пакет, вставь кабель на место и все будет в порядке!» 
    Не могу не поблагодарить всех очаровательных женщин из агентства «Class A Travel»: 
    Норму Кут (Norma Coote), Дженифер Харпстер (Jenifer Harpster), Ноук 
Интахай (Nouk Inthaxai) и Джоуди Смолл (Jodi Small). Без этих добрых фей я бы 
просто пропал, ведь я все время в разъездах. Теперь с места не сдвинусь, пока 
не посоветуюсь с вами. Их сокровенное желание — отправить меня не в деловую, а 
в туристическую поездку. Обещаю в будущем исправиться. 
    Лью Пераззоли (Lou Perazzoli), Стив Вуд (Steve Wood) и Марк Луковски (Marc 
Lucovsky) — из команды разработчиков Windows NT — отрецензировали несколько 
глав и любезно ответили на кучу вопросов о потоках и управлении памятью. 
    Брайан Смит (Brian Smith), Джон Томасон (Jon Thomason) и Майкл Тутони 
(Michael Toutonghi) — из команды разработчиков Windows 95 — разъяснили мне 
несколько вопросов, связанных с потоками и управлением памятью в Windows 95. 
    Асмус Фрейтаг (Asmus Freytag) (по прозвищу «доктор Unicode») был 
рецензентом главы по Unicode и однажды вечером в Сиэтле за обедом в «Красном 
Снегире» — что называется в последнюю минуту — выдал несколько соображений. 
    Дейв Харт (Dave Hart) — из группы разработчиков NTVDM для Windows NT — 
потерял массу времени, общаясь со мной лично и по электронной почте; а я 
засыпал его вопросами о том, как выполняются 16-разрядные программы MS-DOS и 
Windows в NTVDM-слое Windows NT. Немногое из этих сведений вошло в книгу, но 
Дейв помог мне гораздо глубже вникнуть в суть Windows NT. 
    Чак Митчел (Chuck Mitchell), Стив Солсбери (Steve Salisbury) и Джонатан 
Марк (Jonathan Mark) — из команды разработчиков Visual C++ для Win32 — 
ответили на ряд вопросов о структурной обработке исключений, локальной памяти 
потока, стандартных библиотеках С и компоновке. 
    Хотелось бы также упомянуть и поблагодарить Марка Дерли (Mark Durley) и 
Сезари Маркян (Cezary Marcjan), которые нашли ошибки в первом издании, 
подсказали мне массу идей и вообще любили потолковать о программировании в Win32. 
    Моя признательность и нескольким программистам из команды разработчиков 
Visual C++, с которыми мне довелось совместно поработать: Байрону Дейзи (Byron 
Dazey), Эрику Лангу (Eric Lang) («А в Лондоне пьют молоко?»), Дэну Спеллингу 
(Dan Spalding), Мэттью Тэббсу (Matthew Tebbs) («Спасибо за обед и завтрак!»), 
Брюсу Джонсону (Bruce Johnson), Джону Джорстаду (Jon Jorstad) («Как это лучше 
сказать?»), Дейву Хендерсону (Dave Henderson) и Т.К. Брэкмену (Т.К. Brackmen). 

    _________________________________________От автора xix 

    Берни Мак-Илрой (Bernie Mcllroy) помог протестировать приложения-примеры 
на машине с процессором DEC Alpha. Почему-то Берни считает, что введения во 
всех книгах должны начинаться со слов «В начале...». Он также известен своей 
философией: «Жизнь — это такая чертова штука». 
    Салли Стикни (Sally Stickney) — редактор третьего издания моей книги в 
Microsoft Press. Ее титанические усилия позволили выпустить книгу в рекордные 
сроки. Особенно если учесть, что за пару недель до сдачи оригинал-макета в 
типографию я уехал в Италию. 
    Джим Фачс (Jim Fuchs) — научный редактор второго издания моей книги в 
Microsoft Press. Он здорово потрудился над проверкой текстов моих программ и 
файлов ресурсов. Джим был совершенно неутомим, хотя я бесконечно вносил изменения. 
    Ребекка Глисон (Rebecca Gleason) — редактор второго издания моей книги в 
Microsoft Press. Я в большом долгу перед ней за то, что в последний момент 
запихнул все RC-файлы обратно в книгу*. Ребекка всегда была на высоте, и на 
все у нее был ответ — обычно один: 
    «Ну, это вопрос стиля». До сих пор не могу прийти в себя после того обеда, 
который мы сгоряча проглотили в магазине Dixie's BBQ/Porter's Automovie. 
    Нэнси Сайэдек (Nancy Siadek) — редактор первого издания — заслуживает 
награды за тот труд, который она вложила в мою книгу. Уверен, она и подумать 
не могла, с чем ей придется связаться. За короткое время, проведенное с ней, я 
столькому научился — в смысле литературы — больше, чем за всю свою жизнь. 
    Хочу поблагодарить и остальных сотрудников издательства Microsoft Press, 
принимавших участие в подготовке книги. Многих я даже не видел, но результаты 
их усилий выше всяческих похвал. Третье издание готовили: Эрик Стру (Eric 
Stroo), Филип Борнз (Philip Borgnes); художник Трэвис Бэвен (Travis Beaven); 
верстальщики Пегги Херман (Peggy Herman), Джеффри Брендек (Jeffrey Brendecke), 
Сьюзан Преттиман (Susan Prettyman), Линда Робинсон (Linda Robinson), Элизабет 
Тебо Понг (Elisabeth Thebaud Pong) и Пол Ваутьер (Paul Vautier); корректоры 
Ричард Кэри (Richard Carey), Рон Драммонд (Ron Drummond), Патрик Форгетт 
(Patrick Forgette), Тери Кеффер (Teri Kieffer), Роджер Ле-Бланк (Roger 
LeBlanc), Патриция Массерман (Patricia Masserman), Девон Масгрейв (Devon 
Musgrave), Черил Пеннер (Cheryl Penner) и Паула Турман (Paula Thurman). Второе 
издание готовили: Шон Пек (Shawn Peck), Джон Car (John Sugg), Джим Крамер (Jim 
Kramer), Майкл Виктор (Michael Victor), Ким Эглстон (Kim Eggleston), Дэвид 
Холтер (David Holter), Пенелопа Уэст (Penelope West), Ричард Картер (Richard 
Carter), Элизабет Тебо Понг (Elisabeth Thebaud Pong), Пегги Херман (Peggy 
Herman) и Барбара Реммил (Barbara Remmele). А над первым изданием работали: 
Эрин 0'Коннор (Erin O'Connor), Лаура Сакерман (Laura Sackerman), Дебора Лонг 
(Deborah Long), Пегги Херман (Peggy Herman), Лайза Айверсен (Lisa Iversen) и 
Барб Раньян (Barb Runyan). 
    Я также благодарен: 
    Дэну Хорну (Dan Horn) из Borland International — за предложения и 
замечания по нескольким главам и за то, что угостил учителя яблоком. 
    Джиму Лейну (Jim Lane), Тому Ван Бааку (Torn Van Baak), Ричу Питерсону 
(Rich Peterson) и Биллу Бакстеру (Bill Baxter) — за помощь с компилятором DEC Alpha. 
    Дину Холмсу (Dean Holmes), одному из директоров издательства Microsoft 
Press. Я слишком часто испытывал его терпение, задерживая первое издание книги 
— меня в то время часто отвлекали дела, связанные с покупкой нового дома. 
    Гретчен Билсон (Gretchen Bilson) и всем сотрудникам Microsoft Systems 
Journal— без их поддержки я бы бросил книгу. 
    * Прим. издательства: к сожалению, в связи с ограничениями на объем книги 
RC-файлы изъяты из текста русского издания, но содержатся на компакт-диске, 
прилагаемом к книге. 

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

    Чарлзу Петцольду (Charles Petzold) — он привел меня в Microsoft Press. 
    Карлосу Ричардсону (Carlos Richardson) — за помощь в подключении TJ-Net 
(моей домашней сети) и ее настройке в моем новом доме. 
    Донне Мюррей (Donna Murray) — за долгие годы любви, поддержки и дружбы. 
Меня восхищает ее способность всегда добиваться своего. 
    Моему брату Рону — за то, что обещал найти мне «Саламандру» Патрика Мораза 
(Patrick Moraz). Хоть он так и не нашел, но все же пытался. Ладно, я попрошу 
Питера Габриэля поставить автограф на твоей клюшке — в следующий раз, когда он 
приедет к нам на гастроли. Надеюсь, ты победишь на соревнованиях, и нам 
удастся вместе с твоей Марией съездить в Англию. 
    Моим маме и папе, Арлин и Силвэну, — за любовь и поддержку. Мой дом всегда 
открыт для вас. Перед телевизором я поставлю целый мешок с попкорном и накуплю подушек. 
