Для кого предназначена эта книга?
Что мне необходимо знать и иметь?
Что ждет вас в WWW-библиотеке?
Благодарность

Введение
Что такое "программирование"?
Мой подход
Мои предположения относительно вас
Что вы найдете в этой книге
Приложенный код
Чего вы не найдете в этой книге
Нахальная вставка
Не оставайтесь в стороне

Часть I. Основы

Глава 1. Добро пожаловать в реальный мир
Windows 95 крупным планом
Публичные и приватные программы
Насколько публичное публично?
Этика и метафоры
Знакомьтесь: это ваши пользователи
Игры, в которые играют люди
Любовь приходит и уходит, а программы
остаются
Как не следует относиться к
пользователям-новичкам
Как нужно относиться к пользователям -
новичкам и гуру

Глава 2. Философия разработки программного
обеспечения
для Windows:макропроблемы

Стиль
Математики и ювелиры
Три источника и три составные части
качества программы
Корректность
Разумность
Услужливость
Примеры с придирками: что такое "хорошо"
и что
такое "плохо"
Десять макроуровневых рекомендаций
0. Имейте широкий взгляд на мир и
планируйте на будущее
1. Стремитесь к балансу во всех решениях
2. Сделайте принцип KISS вашей религией
3. You(Now) != You(Later)
4. Уважайте ресурсы вашего пользователя
5. Используйте DLL осторожно
6. Придерживайтесь широкого взгляда на
инструментарий
7. Не забывайте о производительности
8. Не забывайте о тестировании
9. Думайте о повторном использовании кода

Глава 3. Философия разработки программного
обеспечения
для Windows: микропроблемы

Шесть микроуровневых рекомендаций
10. Абстрагируйтесь, абстрагируйтесь
и снова абстрагируйтесь (и не
беспокойтесь о цене
вызова функции, пока программа сама
не заявит об этом)
11. При-меняйте оборонительное
программирование
Что такое "оборонительное
программирование"?
Природа предположений
"Доверяй, но проверяй"
Оборонительное программирование и
повторное
использование кода
12. Выделяйте код, отвечающий за
пользовательский
интерфейс вашей программы
13. Используйте умные файлы данных
14. Элегантно реагируйте на сюрпризы со
стороны
15. Остерегайтесь противоестественных
действий

Глава 4. Инструменты

Что такое "инструмент программирования" и
почему он так важен
Рекомендации по выбору и использованию
инструментов
0. Исследуйте и эксплуатируйте
1. Добивайтесь симбиоза ваших
инструментов
2. Не разбрасывайтесь и не переоценивайте
свои силы
3. Не будьте слишком доверчивы к вашим
поставщикам
4. Разумно эксплуатируйте публичные
исходные коды
5. Не влюбляйтесь в ваш новый блестящий
молоток
Типы инструментов
Справочные материалы
Компиляторы и языки программирования
C/C++: системный язык, используемый в
качестве прикладного
Миф о переносимости
C/C++ и определяемые пользователем типы
Аттестации, аттестации и еще раз
аттестации
И чтобы не забыть...
Если Pascal так прекрасен...
Как жить с C++?
Каркасные библиотеки
Добавления и аксессуары
Третьесторонние библиотеки и компоненты
Третьесторонние отладчики
Системы управления версиями
Инсталляционные программы

Часть II. Практика

Глава 5. Идиома локальной функции
Локальные функции: Pascal реализует их так,
как надо
Шаг 1: грубый перенос на C
Шаг 2: C++ и идиома локальной функции
Реальное применение идиомы
Альтернативы и надежды

Глава 6. Как жить с DLL
Отчаянный поиск DLL
Кто загружается первым?
Спасет ли нас Win32?
Этикет разумного применения динамических
библиотек
Используйте DLL только при необходимости
Правильно располагайте DLL
Старые времена
Новые времена
Загружайте все DLL явно
Пример: Hello

Глава 7. Минимизированные Windows-программы:
вселенная внутри значка
Разновидности минимизированных программ
Механика минимизированных программ...
...и как Windows 95 поменяла правила игры
DROP1 и DROP2
Не бойтесь и минимизируйте

Глава 8. Защита программ от искажений
Добро пожаловать в наш кошмар
Что вы сможете сделать, а чего не сможете
Спасение в CRC
В поисках места для тайника
SELFCHCK и PATCHER
Реализация самопроверки в вашей программе
Вперед, вычисляйте CRC

Глава 9. Умные файлы данных
Для чего используются постоянные хранилища
данных
Системные данные
Настройки приложения
Документы приложения
Основные формы постоянного хранения данных
INI-файлы
Реестр Windows
Специальные бинарные файлы
Умные файлы данных
Пример хранения конфигурационных данных

Глава 10. Абстрагирование в действии:
создание своих виртуальных машин
Зачем это надо?
"Доверять, но проверять" или
"асфальтировать"?
Три степени абстрагирования
Искусство Абстрагирования
Win32 API: бинарный кельвинбол?
E Pluribus Unum

Глава 11. Сделайте вашу программу замкнутой
Зачем нужна минимальная защита?
Защищать или не защищать?
Базовая модель, дубль первый
Базовая модель, дубль второй
Как сделать замкнутой существующую
программу
Проблемы безопасности
Что бы еще замкнуть сегодня?

Часть III. Великий перевал

Глава 12. Из Win16 в Win32
Что такое Windows 95 с точки зрения
прикладного программиста
Win16lock
Изменение типов данных
Что значит изменение размеров типов для
программистов
Перенос 16-битового кода на Windows 95
Выбор стратегии переноса
Великие неизвестные
"Ужастики"
Проверка номера версии: не все так просто
GDI обрезает координаты до двух байт
Ограничения значений cbWndExtra и
cbClsExtra
Формат результата GetOpenFileName()
Где искать ассоциации?
Проблемы с перетаскиванием
App Paths срабатывает для 16-разрядных
программ
лишь наполовину
Функция GetFreeSystemResources() пропала
в Win32
Ау, кто стянул мой значок?
Диалоги масштабируются по-разному
Доступ к INI-файлам
Norton Navigator 1.0 и вы

Глава 13. Не слишком краткая лекция о длинных
именах файлов
Обзор основных свойств длинных имен и
псевдонимов...
...и что это означает
Хранение длинных имен
"Длинные имена файлов как параметры
командной строки.EXE"
Становится только хуже и хуже
Что делать?
Крайние меры
Хорошие новости
Ради Бога, не забывайте о человеческом
факторе!
Ждите ошибок, ждите ошибок...
Ну что ж, умники, и как же, повашему,
Microsoft должна была
реализовать длинные
имена файлов?

Глава 14. Разновидности Win32
Почему Win32 != Win32 != Win32
Документация, документация и снова
документация
Даже Microsoft иногда пьет из этого
колодца
Проверка версии и платформы
Никого нет дома
"Ужастики"
GDI обрезает значения координат до двух
байт
Окна-списки обрезают значения строковых
индексов
Окна-списки не могут обрабатывать длинные
имена
файлов в Windows 95
Функция GetLastError() возвращает
непригодные
для работы значения
Windows 95: проблема с SUBST и
GetShortPathName()
Странности функции GetShortPathName()
Типы данных в реестре
Функция WNetGetUniversalName()
проваливается в Windows 95
Ограничения для cbWndExtra и cbClsExtra
Диалоги масштабируются по-разному
Ау, кто стянул мой значок?
Графические траектории не функционируют
под Windows 95
Функция GetSysColor() не может потерпеть
неудачу
(или все-таки может?)
Win32s может свихнуться, когда
виртуальной памяти
слишком много
Win32s + RICHEDIT = катастрофа
Окна RICHEDIT по умолчанию не посылают
уведомление EN_CHANGE
MoveFileEx() не работает под Windows 95
Рекомендации
Windows NT 4.0: свет в конце туннеля?

Часть IV. Ресурсы

Глава 15. Хит-парад программистского
инструментария
Рекомендации
ABC FlowCharter 4.0 от Micrografx
allCLEAR Version III от Clear Software,
Inc.
Bounds Checker Professional 3.0 от
Nu-Mega Technologies, Inc.
Drag and File 1.0 for Windows 95 and
Windows NT от Canyon Software
ISYS for Windows 4.0 от Odyssey
Development
Microsoft Development Network CD-ROM от
Microsoft
Multimedia ToolBook 3.0 от Asymetrix
Orpheus 1.00 от TurboPower Software
Company
Partition Magic 1.02.177 от PowerQuest
Corporation
SourceSafe 3.1 от Microsoft
System Commander 2.11 от V Communications
Windows 95 Device Driver Kit
Windows NT 3.51
YAHU: еще одна утилита для работы с
заголовочными файлами

Глава 16. Дополнительная литература
Призовой раздел: три неожиданных открытия

Приложения

Приложение А. MegaZero - самая законченная в
мире,
ничего не делающая...
Приложение В. Конспект программистских
небылиц
Приложение С. Библиотека Win32u
Как вы можете принять в этом участие
Что включено в Win32u
Общая философия и поддержка версий
Windows
Обертки для сообщений окон-списков
Обертки для GDI-функций
Вспомогательные обертки и функции
Проверка платформ и отладочный режим