Джефри Рихтер — Создание эффективных WIN32 приложений
[ —>Скачать с сервера (4.54 Mb) — бесплатно]
22.05.2010, 01:04
Windows — это довольно сложная операционная система, вряд ли с этим кто-то может поспорить. Наверное, ни один человек в мире не сможет полностью и до конца разобраться в этой операционной системе.
Данное учебное пособие – это практически целая книга, которая создана для обучения программированию хороших и качественных приложений под Windows на Visual C++. В самоучителе глубоко рассматриваются темы, посвященные взаимодействию с операционной системой, библиотекам языка С, оптимизации кода, динамически подключаемым библиотекам и многое другое. Особенное внимание автор уделил созданию и уничтожению процессов и потоков.
По требованию многочисленных читателей в четвертое издание были включены примеры на С++, более компактные и легкие для понимания, нежели примеры для C. Весь код, описанный в книге, можно включать в свои программы, что, безусловно, сильно упростит жизнь при разработке.
Книга предназначена для опытных программистов или профессионалов своего дела. Для успешного ознакомления с материалом потребуются хорошие знания языка C/C++, а также хотя бы некоторый опыт в создании приложений под Windows. Прилагаемый в архиве компакт-диск содержит все коды, использованные в книге.
Краткое содержание:
Введение
Часть I: Материалы для обязательного чтения
Часть II: Начинаем работать
Часть III: Управление памятью
Часть IV: Динамически подключаемые библиотеки
Часть V: Структурная обработка исключений
Часть VI: Операции с окнами
Приложение A — Среда Разработки
Приложение B — Распаковщики сообщений, макросы для дочерних элементов управления и макросы API
Примеры к книге
Внимание: книга написана в 2001 году, так что её скорее следует рассматривать как антиквариат и изучать без веских на то причин не рекомендуется
Джеффри Рихтер — лучшие книги
Год издания: 2013
Эта книга, выходящая в четвертом издании и уже ставшая классическим учебником по программированию, подробно описывает внутреннее устройство и функционирование общеязыковой исполняющей среды (CLR) Microsoft .NET Framework версии 4.5. Написанная признанным экспертом в области программирования Джеффри Рихтером, много лет являющимся консультантом команды разработчиков .NET Framework компании Microsoft, книга научит вас создавать по-настоящему надежные приложения любого вида, в том числе с использованием Microsoft Silverlight, ASP.NET, Windows Presentation Foundation и т.д. Четвертое издание полностью обновлено в соответствии со спецификацией…
Год издания: 2007
Эта книга — подробное описание внутреннего устройства и функционирования общеязыковой исполняющей среды (CLR) Microsoft .NET Framework версии 2.0. В ней раскрыта система типов .NET Framework и разъяснены способы управления ими. Представлены
Год издания: 2001
Серия: Для профессионалов
Это издание — практически новая книга, посвященная программированию серьезных приложений на Microsoft Visual C++ в операционных системах Windows 2000 (32- и 64-разрядных версиях) и Windows 98 с использованием функций Windows API. Состоит из 27 глав, двухприложений и предметного указателя. Гораздо глубже, чем в предыдущих изданиях, рассматриваются такие темы, как взаимодействие с операционной системой, библиотеки C/C++, программирование DLL и оптимизация кода, описываются новые механизмы и функции, появившиеся в Windows 2000, и приводится информация, специфическая для 64-разрядной Windows 2000. В этом издании автор, перейдя с языка С на C++,…
Год издания: 2008
Это издание — практически новая книга, посвященная разработке серьезных приложений на Visual C++ в операционных системах Windows XP и Windows Vista (32- и 64-разрядных версиях) с использованием функций Windows API. Гораздо глубже, чем в предыдущих изданиях, рассматриваются такие темы, как механизм User Account Control, взаимодействие с системой библиотеки C/C++ при реализации защитных механизмов и обработке исключений; представлены новые синхронизирующие механизмы. В это издание добавлены две совершенно новые главы: о механизмах ввода-вывода и о работе новой системы Windows Error Reporting, изменившей подходы к созданию отчетов об ошибках и…
Рихтер Дж., Назар К. — Windows via C C++. Программирование на языке Visual C++ — 2009
Часть I Материалы для обязательного чтения .
Глава 1 Обработка ошибок .
Вы тоже можете это сделать .
Программа-пример ErrorShow.. . 8
Глава 2. Работа с символами и строками .
Символьные и строковые типы данных для ANSI и Unicode.
Unicode- и ANSI-функции в Windows .
Unicode- и ANSI-функции в библиотеке С.
Безопасные строковые функции в библиотеке С .
Введение в безопасные строковые функции.
Дополнительные возможности при работе со строками .
Строковые функции Windows. .
Рекомендуемые приемы работы с символами и строками .
Перекодировка строк из Unicode в ANSI и обратно .
Экспорт DLL-функций для работы с ANSI и Unicode .
Определяем формат текста (ANSI или Unicode).
Глава 3. Объекты ядра .
Что такое объект ядра .
Учет пользователей объектов ядра .
Таблица описателей объектов ядра.
Создание объекта ядра.
Закрытие объекта ядра .
Совместное использование объектов ядра несколькими процессами.
Наследование описателя объекта .
Дублирование описателей объектов .
Часть II Приступаем к работе .
Глава 4. Процессы .
Ваше первое Windows-приложение.
Описатель экземпляра процесса .
Описатель предыдущего экземпляра процесса.
Командная строка процесса .
Привязка к процессорам .
Режим обработки ошибок .
Текущие диск и каталог для процесса .
Определение версии системы.
Параметры pszApplicationName и pszCommandLine.
Параметры psaProcess, psaThread и bInheritHandles .
Возврат управления входной функцией первичного потока .
Когда все потоки процесса уходят .
Что происходит при завершении процесса .
Запуск обособленных дочерних процессов.
Работа администратора с пользовательскими полномочиями .
Автоматическое повышение привилегий процесса .
Повышение привилегий процесса вручную.
О текущем контексте привилегий .
Перечисление процессов, выполняемых в системе .
Глава 5. Задания .
Определение ограничений, налагаемых на процессы в задании .
Включение процесса в задание .
Завершение всех процессов в задании .
Получение статистической информации о задании .
Глава 6. Базовые сведения о потоках .
В каких случаях потоки создаются .
И в каких случаях потоки не создаются .
Ваша первая функция потока .
Параметры pfnStartAddr и pvParam.
Возврат управления функцией потока.
Если завершается процесс.
Что происходит при завершении потока.
Кое-что о внутреннем устройстве потока.
Некоторые соображения по библиотеке С/С++.
Ой, вместо beginthreadex я по ошибке вызвал CreateThread .
Библиотечные функции, которые лучше не вызывать .
Как узнать о себе .
Преобразование псевдоописателя в настоящий описатель .
Глава 7. Планирование потоков, приоритет
и привязка к процессорам .
Приостановка и возобновление потоков.
Приостановка и возобновление процессов .
Переключение потоков на компьютерах с процессором,
Определение периодов выполнения потока.
Динамическое изменение уровня приоритета потока.
Подстройка планировщика для активного процесса .
Приоритеты запросов ввода-вывода .
Программа-пример Scheduling Lab .
Привязка потоков к процессорам.
Глава 8. Синхронизация потоков в пользовательском режиме .
Атомарный доступ: семейство Interlocked-функций .
Более сложные методы синхронизации потоков.
Худшее, что можно сделать.
Критические секции: важное дополнение.
Критические секции и спин-блокировка .
Критические секции и обработка ошибок .
Несколько полезных приемов.
Глава 9. Синхронизация потоков с использованием объектов ядра .
Побочные эффекты успешного ожидания .
Ожидаемые таймеры и АРС-очередь .
И еще кое-что о таймерах.
Мьютексы и критические секции.
Сводная таблица объектов, используемых для синхронизации потоков .
Другие функции, применяемые в синхронизации потоков.
Асинхронный ввод-вывод на устройствах .
Функция WaitForInputIdle.. . 323
Обнаружение взаимных блокировок с помощью WaitChain Traversal API .
Глава 10. Синхронный и асинхронный ввод-вывод на устройствах .
Открытие и закрытие устройств.
Близкое знакомство с функцией CreateFile.
Флаги функции CreateFile, управляющие кэшированием.
Другие флаги функции CreateFile.
Флаги файловых атрибутов .
Работа с файлами .
Определение размера файла .
Установка указателя в файле.
Установка конца файла.
Синхронный ввод-вывод на устройствах .
Сброс данных на устройство .
Отмена синхронного ввода-вывода .
Асинхронный ввод-вывод на устройствах: основы .
Асинхронный ввод-вывод на устройствах: «подводные камни».
Отмена запросов ввода-вывода, ожидающих в очереди .
Уведомление о завершении ввода-вывода .
Освобождение объекта ядра «устройство».
Освобождение объекта ядра «событие» .
Ввод-вывод с оповещением .
Порты завершения ввода-вывода.
Создание портов завершения ввода-вывода .
Связывание устройства с портом завершения ввода-вывода.
Архитектура программ, использующих порты завершения ввода-вывода .
Как порт завершения ввода-вывода управляет пулом потоков .
Сколько потоков должно быть в пуле? .
Эмуляция выполненных запросов ввода-вывода .
Глава 11. Пулы потоков .
Сценарий 1. Асинхронный вызов функций .
Явное управление рабочими элементами.
Сценарий 2. Вызов функций через определенные интервалы времени .
Сценарий 3. Вызов функций при освобождении отдельных объектов ядра .
Сценарий 4. Вызов функций по завершении запросов
Обработка завершения обратного вызова .
Настройка пула потоков .
Корректное разрушение пула потоков и группы очистки.
Глава 12. Волокна .
Работа с волокнами.
Часть III Управление памятью .
Глава 13. Архитектура памяти в Windows .
Виртуальное адресное пространство процесса .
Как адресное пространство разбивается на разделы .
Раздел для выявления нулевых указателей .
Раздел для кода л данных пользовательского режима.
Раздел для кода и данных режима ядра .
Регионы в адресном пространстве .
Передача региону физической памяти .
Физическая память в страничный файл.
Физическая память в страничном файле не хранится .
Защита типа «копирование при записи.
Специальные флаги атрибутов защиты .
Блоки внутри регионов .
Глава 14. Исследование виртуальной памяти .
Статус виртуальной памяти .
Управление памятью на компьютерах с архитектурой NUMA.
Определение состояния адресного пространства .
Глава 15. Использование виртуальной памяти в приложениях .
Резервирование региона в адресном пространстве .
Передача памяти зарезервированному региону .
Резервирование региона с одновременной передачей физической памяти.
В какой момент региону передают физическую память .
Возврат физической памяти и освобождение региона. .
В какой момент физическую память возвращают системе .
Изменение атрибутов защиты .
Сброс содержимого физической памяти .
Механизм Address Windowing Extensions.
Глава 16. Стек потока .
Функция из библиотеки С/С++ для контроля стека .
Глава 17. Проецируемые в память файлы .
Проецирование в память EXE- и DLL-файлов.
Статические данные не разделяются несколькими
экземплярами EXE или DLL.
Файлы данных, проецируемые в память .
Использование проецируемых в память файлов.
Обработка больших файлов .
Проецируемые файлы и когерентность .
Базовый адрес файла, проецируемого в память .
Особенности проецирования файлов .
Совместный доступ процессов к данным через механизм проецирования .
Файлы, проецируемые на физическую память из страничного файла .
Частичная передача физической памяти проецируемым файлам .
Глава 18. Динамически распределяемая память .
Стандартная куча процесса .
Дополнительные кучи в процессе.
Более эффективное управление памятью .
Исключение издержек связанных с синхронизацией потоков.
Быстрое освобождение всей памяти в куче .
Создание дополнительной кучи.
Выделение блока памяти из кучи.
Изменение размера блока .
Определение размера блока.
Использование куч в программах на С++ .
Другие функции управления кучами.
Динамически подключаемые библиотеки .
Глава 19. DLL: основы .
DLL и адресное пространство процесса .
Глава 20. DLL: более сложные методы программирования .
Явная загрузка DLL и связывание идентификаторов.
Явная загрузка DLL .
Явная выгрузка DLL.
Явное подключение экспортируемого идентификатора.
Как система упорядочивает вызовы DllMain.
Функция DllMain и библиотека С/С++.
Отложенная загрузка DLL .
Переадресация вызовов функций .
Модификация базовых адресов модулей .
Глава 21. Локальная память потока .
Динамическая локальная память потока .
Использование динамической TLS .
Статическая локальная память потока .
Глава 22. Внедрение DLL и перехват API-вызовов .
Пример внедрения DLL .
Внедрение DI L с использованием реестра .
Внедрение DLL с помощью ловушек.
Утилита для сохранения позиций элементов на рабочем столе .
Внедрение DLL с помощью удаленных потоков. .
Внедрение троянской DLL.
Внедрение DLL как отладчика .
Внедрение кода через функцию CreateProcess.
Перехват APIвызовов: пример.
Перехват API-вызовов подменой кода.
Перехват API-вызовов с использованием раздела импорта.
Часть V Структурная обработка исключений .
Глава 23. Обработчики завершения .
Примеры использования обработчиков завершения.
Проверьте себя: FuncaDoodleDoo .
Funcarama4: последний рубеж .
И еще о блоке finally .
Глава 24. Фильтры и обработчики исключений .
Примеры использования фильтров и обработчиков исключений.
Некоторые полезные примеры .
Остановка глобальной раскрутки .
Будьте осторожны с EXCEPTION_CONTmUE_EXECUTION .
Глава 25. Необработанные исключения, векторная обработка
исключений и исключения C++ .
Как работает функция UnhandkdExceptionFiker.
Взаимодействие UnhandledExceptionFilter с WER .
Отладка по запросу .
Векторная обработка исключений и обработчики возобновления.
Исключения С++ и структурные исключения.. .
Исключения и отладчик .
Глава 26. Отчеты об ошибках и восстановление приложений .
Консоль Windows Error Reporting .
Программная генерация отчетов об ошибках в Windows .
Отключение генерации и отправки отчетов.
Настройка генерируемых для процесса отчетов о сбоях.
Создание и настройка отчетов о сбоях.
Программа-пример Customized WER.
Автоматический перезапуск и восстановление приложений.
Автоматический перезапуск приложения .
Поддержка восстановления приложений .
Часть VI Приложения .
Приложение А. Среда разработки .
Заголовочный файл CmnHdr.h.
Раздел Windows Version Build Option .
Раздел Unicode Build Option.
Раздел Windows Definitions и диагностика уровня 4 .
Вспомогательный макрос Pragma Message.
Моя реализация DebugBreak для платформы x86 .
Определение кодов программных исключений.
Макросы chASSERT и chVERIFY.
Принудительное указание компоновщику входной функции (w)WinMain.
Поддержка тем оформления Windows XP с помощью директивы pragma.
Приложение Б. Распаковщики сообщений, макросы
для дочерних элементов управления и API-макросы .
Макросы — распаковщики сообщений.
Макросы для дочерних элементов управления.
Мы бы не смогли написать эту книгу без поддержки и технической помощи многих людей. Вот кого мы хотим поблагодарить особо.
Джеффри благодарит жену Кристин и сына Эйдана за безграничную любовь и поддержку.
Кристоф никогда бы не осилил пятое издание этой книги без любви и содействия своей жены Флоранс, а также неиссякаемого любопытства дочери Сели. Его кошки Канэль и Нуга также внесли свой вклад (уютным мурлыканьем). Теперь, когда книга закончена, Кристофу нечем будет оправдывать недостаток внимания к ним!
Чтобы написать такую книгу, мало личных усилий авторов. Джеффри и Кристоф выражают глубокую признательность сотрудникам Microsoft за неоценимую помощь. В частности, они благодарят Аруна Кишана (Arun Kishan) за оперативные ответы на заковыристые вопросы и поиск в команде создателей Windows людей, способных разъяснить тот или иной вопрос. Особой благодарности также заслуживают Киншуман Кинпгуман (Kinshu-man Kinshumann), Стефан Долл (Stephan Doll), Уэдсон Алмейда Фило (Wedson Almeida Filho), Эрик Ли (Eric Li), Жан-Ив Публан Qean-Yves Poub-lan),
Сандип Ранад (Sandeep Ranade), Алан Чан (Alan Chan), Эл Контенти (Ale Contenti), Канн Су Гэтлин (Kang Su Gatlin), Кай Су (Kai Hsu), Мехмет Лайган (Mehmet Iyigun), Кен Юнь
(Ken Jung), Павел Лебединский (Pavel Lebedynskiy), Пол Сливович (Paul Sliwowicz) и
Лэнди Вонг (Landy Wang). Благодарим также всех, отвечавших на вопросы, опубликованные на внутренних форумах Майрософт, — Раймонда Чена (Raymond Chen),
Сангука Чу (Sunggook Chue), Криса Корио (Chris Corio), Лари Остермана (Larry Osterman), Ричарда Рассела (Richard RusseU), Марка Руссиновича (Mark Russinovich), Майка Шелдона (Mike Sheldon), Дэмиена Уоткинса (Damien Watkins) и Юньфень Чжань (Junfeng Zhang). Также выражаем искреннюю благодарность Джону Роббинсу по прозвищу
«Убийца багов» (John «Bugs-layer» Robbins) и Кенни Keppy (Kenny Kerr), чьи отзывы были большим подспорьем в работе над этой книгой.
Авторы признательны рецензенту издательства Бену Райану (Ben Ryan), поверившему в такого ненормального француза как Кристоф, менеджерам Линн Финел (Lynn Finnel) и Кертису Филипсу (Curtis Philips) — за терпение, Скотту Сили (Scott Seely) — за стремление к точности в технических вопросах, Роже Леблану (Roger LeBlanc) — за виртуозный перевод «франко-английского» наречия Кристофа на понятный язык, Андреа Фокс (Andrea Fox) — за тщательную корректуру. Помимо команды из Редмонда, много личного времени отдала работе над книгой Джоанта Сен (Joyanta Sen).
Наконец, Кристоф искренне благодарит Джеффри Рихтера за то, что Джефф доверил ему работу над пятым изданием книги; Джеффри же благодарен Кристофу за неутомимость в поиске информации, а также за многократную перестройку и переработку материала в стремлении к идеалу (такому, каким его видел Джефф).
Microsoft Windows — сложная операционная система. Она включает в себя столько всего и делает так много, что одному человеку просто не под силу полностью разобраться в этой системе. Более того, из-за такой сложности и комплексности Windows трудно решить, с чего начать ее изучение. Лично я всегда начинаю с самого низкого уровня, стремясь получить четкое представление о базовых сервисах операционной системы. Разобравшись в основах, дальше двигаться проще. С этого момента я шаг за шагом, по мере необходимости, изучаю сервисы более высокого уровня, построенные именно на этом базисе. Поэтому основное внимание в этой книге уделяется фундаментальным концепциям, которые должны знать те, кому придется заниматься проектированием и реализацией программ для операционной системы Windows. Вкратце, читатели познакомятся с различными возможностями Windows и научатся использовать их в своих программах на языках С и С++.
Вопросы, относящиеся к компонентной модели объектов (Component Object Model, СОМ), в моей книге прямо не затрагиваются. Но СОМ — это архитектура, где используются процессы, потоки, механизмы управления памятью, DLL, локальная память потоков, Unicode и многое другое. Если вы знаете, как устроены и работают эти фундаментальные сервисы операционной системы, то для освоения СОМ достаточно понять, как они применяются в этой архитектуре. Мне очень жаль тех, кто пытается перепрыгнуть через все это и сразу же взяться за изучение архитектуры СОМ. Впереди у них долгий и тернистый путь; в их знаниях неизбежны пробелы, которые непременно будут мешать им в работе.
В этой книге также не рассматривается общеязыковая исполняющая среда (common language runtime, CLR) платформы .NЕТ Framework от Майкрософт (ей посвящена отдельная книга: CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#, Русская редакция, Питер, 2006-2007). Однако CLR реализована в виде объекта СОМ внутри библиотеки DLL, которая загружается в процесс и использует потоки для манипулирования в памяти строками в формате Unicode. Так что полученные из этой книги знания о базовых «строительных блоках» помогут и при написании управляемого кода. Кроме того, поддерживаемый CLR механизм Platform Invocation (P/Invoke) позволяет вызывать различные API Windows, о которых много говорится в этой книге.