
Рихтер Дж., Назар К. - Windows via C C++. Программирование на языке Visual C++ - 2009
.pdfОглавление
Благодарности................................................................................................... |
XIII |
Введение ........................................................................................................................... |
XIV |
Часть I Материалы для обязательного чтения ..................................................... |
1 |
Глава 1 Обработка ошибок................................................................................................... |
2 |
Вы тоже можете это сделать .................................................................................................. |
7 |
Программа-пример ErrorShow.. .............................................................................................. 8 |
|
Глава 2. Работа с символами и строками ....................................................................... |
11 |
Наборы символов .................................................................................................................. |
12 |
Символьные и строковые типы данных для ANSI и Unicode.............................................. |
14 |
Unicode- и ANSI-функции в Windows .................................................................................... |
16 |
Unicode- и ANSI-функции в библиотеке С............................................................................ |
19 |
Безопасные строковые функции в библиотеке С ................................................................ |
20 |
Введение в безопасные строковые функции................................................................. |
21 |
Дополнительные возможности при работе со строками .............................................. |
25 |
Строковые функции Windows... ...................................................................................... |
27 |
Почему Unicode?.................................................................................................................... |
29 |
Рекомендуемые приемы работы с символами и строками ................................................ |
30 |
Перекодировка строк из Unicode в ANSI и обратно ............................................................ |
31 |
Экспорт DLL-функций для работы с ANSI и Unicode .................................................... |
33 |
Определяем формат текста (ANSI или Unicode)........................................................... |
35 |
Глава 3. Объекты ядра ....................................................................................................... |
37 |
Что такое объект ядра ........................................................................................................... |
37 |
Учет пользователей объектов ядра ............................................................................... |
39 |
Защита.............................................................................................................................. |
39 |
Таблица описателей объектов ядра..................................................................................... |
42 |
Создание объекта ядра................................................................................................... |
43 |
Закрытие объекта ядра ................................................................................................... |
45 |
Совместное использование объектов ядра несколькими процессами.............................. |
48 |
Наследование описателя объекта ................................................................................. |
49 |
Именованные объекты.................................................................................................... |
54 |
Дублирование описателей объектов ............................................................................. |
68 |
Часть II Приступаем к работе ............................................................................... |
75 |
Глава 4. Процессы ............................................................................................................... |
76 |
Ваше первое Windows-приложение...................................................................................... |
77 |
Описатель экземпляра процесса ................................................................................... |
83 |
Описатель предыдущего экземпляра процесса............................................................ |
85 |
Командная строка процесса ........................................................................................... |
86 |
Переменные окружения .................................................................................................. |
87 |
Привязка к процессорам ................................................................................................. |
94 |
Режим обработки ошибок ............................................................................................... |
94 |
Текущие диск и каталог для процесса ........................................................................... |
95 |
VI |
Оглавление |
|
|
Определение версии системы........................................................................................ |
97 |
|
Функция CreateProcess........................................................................................................ |
101 |
|
Параметры pszApplicationName и pszCommandLine................................................... |
102 |
|
Параметры psaProcess, psaThread и bInheritHandles ................................................. |
104 |
|
Параметр fdwCreate ...................................................................................................... |
106 |
|
Параметр pvEnvironment ............................................................................................... |
108 |
|
Параметр pszCurDir....................................................................................................... |
109 |
|
Параметр psiStartInfo..................................................................................................... |
109 |
|
Параметр ppiProcInfo..................................................................................................... |
117 |
|
Завершение процесса ......................................................................................................... |
119 |
|
Возврат управления входной функцией первичного потока ...................................... |
119 |
|
Функция ExitProcess ...................................................................................................... |
120 |
|
Функция TerminateProcess ............................................................................................ |
121 |
|
Когда все потоки процесса уходят ............................................................................... |
122 |
|
Что происходит при завершении процесса ................................................................. |
122 |
|
Дочерние процессы ............................................................................................................. |
123 |
|
Запуск обособленных дочерних процессов................................................................. |
125 |
|
Работа администратора с пользовательскими полномочиями ........................................ |
126 |
|
Автоматическое повышение привилегий процесса .................................................... |
130 |
|
Повышение привилегий процесса вручную................................................................. |
132 |
|
О текущем контексте привилегий ................................................................................. |
134 |
|
Перечисление процессов, выполняемых в системе ................................................... |
136 |
|
Программа-пример ProcessInfo .................................................................................... |
137 |
|
Глава 5. Задания ................................................................................................................ |
144 |
|
Определение ограничений, налагаемых на процессы в задании .................................... |
149 |
|
Включение процесса в задание .......................................................................................... |
157 |
|
Завершение всех процессов в задании ............................................................................. |
158 |
|
Получение статистической информации о задании ................................................... |
158 |
|
Уведомления заданий ......................................................................................................... |
162 |
|
Программа-пример JobLab.................................................................................................. |
165 |
|
Глава 6. Базовые сведения о потоках ........................................................................... |
167 |
|
В каких случаях потоки создаются ..................................................................................... |
168 |
|
И в каких случаях потоки не создаются ............................................................................. |
170 |
|
Ваша первая функция потока ............................................................................................. |
171 |
|
Функция CreateThread.......................................................................................................... |
172 |
|
Параметр psa................................................................................................................. |
173 |
|
Параметр cbStackSize ................................................................................................... |
173 |
|
Параметры pfnStartAddr и pvParam.............................................................................. |
174 |
|
Параметр dwCreateFlags............................................................................................... |
175 |
|
Параметр pdwThreadID ................................................................................................. |
175 |
|
Завершение потока.............................................................................................................. |
176 |
|
Возврат управления функцией потока......................................................................... |
176 |
|
Функция ExitThread. ....................................................................................................... |
176 |
|
Функция TerminateThread.............................................................................................. |
177 |
|
Если завершается процесс........................................................................................... |
177 |
|
Что происходит при завершении потока...................................................................... |
178 |
|
Кое-что о внутреннем устройстве потока........................................................................... |
179 |
|
Некоторые соображения по библиотеке С/С++................................................................. |
181 |
|
Ой, вместо beginthreadex я по ошибке вызвал CreateThread ..................................... |
192 |
|
Библиотечные функции, которые лучше не вызывать ............................................... |
192 |
|
Как узнать о себе ................................................................................................................. |
193 |
|
Преобразование псевдоописателя в настоящий описатель ...................................... |
194 |
Оглавление |
VII |
Глава 7. Планирование потоков, приоритет |
|
и привязка к процессорам................................................................................................ |
197 |
Приостановка и возобновление потоков............................................................................ |
199 |
Приостановка и возобновление процессов ....................................................................... |
200 |
Функция Sleep ...................................................................................................................... |
202 |
Переключение потоков ........................................................................................................ |
202 |
Переключение потоков на компьютерах с процессором, |
|
поддерживающим HyperThreading ............................................................................... |
203 |
Определение периодов выполнения потока...................................................................... |
204 |
Структура CONTEXT............................................................................................................ |
208 |
Приоритеты потоков ............................................................................................................ |
213 |
Абстрагирование приоритетов............................................................................................ |
214 |
Программирование приоритетов ........................................................................................ |
219 |
Динамическое изменение уровня приоритета потока................................................. |
222 |
Подстройка планировщика для активного процесса .................................................. |
223 |
Приоритеты запросов ввода-вывода ........................................................................... |
224 |
Программа-пример Scheduling Lab .............................................................................. |
226 |
Привязка потоков к процессорам........................................................................................ |
233 |
Глава 8. Синхронизация потоков в пользовательском режиме ............................... |
238 |
Атомарный доступ: семейство Interlocked-функций .......................................................... |
239 |
Кэш-линии............................................................................................................................. |
246 |
Более сложные методы синхронизации потоков............................................................... |
248 |
Худшее, что можно сделать.......................................................................................... |
249 |
Критические секции ............................................................................................................. |
250 |
Критические секции: важное дополнение.................................................................... |
253 |
Критические секции и спин-блокировка ....................................................................... |
256 |
Критические секции и обработка ошибок .................................................................... |
257 |
«Тонкая» блокировка ........................................................................................................... |
259 |
Условные переменные ........................................................................................................ |
263 |
Приложение-пример Queue .......................................................................................... |
264 |
Несколько полезных приемов....................................................................................... |
277 |
Глава 9. Синхронизация потоков с использованием объектов ядра ...................... |
280 |
Wait-функции........................................................................................................................ |
282 |
Побочные эффекты успешного ожидания ......................................................................... |
286 |
События................................................................................................................................ |
288 |
Программа-пример Handshake ..................................................................................... |
293 |
Ожидаемые таймеры........................................................................................................... |
298 |
Ожидаемые таймеры и АРС-очередь .......................................................................... |
302 |
И еще кое-что о таймерах............................................................................................. |
305 |
Семафоры ............................................................................................................................ |
306 |
Мьютексы ............................................................................................................................. |
308 |
Мьютексы и критические секции................................................................................... |
311 |
Программа-пример Queue ............................................................................................ |
312 |
Сводная таблица объектов, используемых для синхронизации потоков ........................ |
321 |
Другие функции, применяемые в синхронизации потоков................................................ |
323 |
Асинхронный ввод-вывод на устройствах ................................................................... |
323 |
Функция WaitForInputIdle.. ............................................................................................. 323 |
|
Функция MsgWaitForMultipleObjects(Ex) ....................................................................... |
325 |
Функция WaitForDebugEvent ......................................................................................... |
325 |
функция SignalObjectAndWait ....................................................................................... |
326 |
Обнаружение взаимных блокировок с помощью WaitChain Traversal API ................ |
327 |
VIII |
Оглавление |
|
|
Глава 10. Синхронный и асинхронный ввод-вывод на устройствах....................... |
336 |
|
Открытие и закрытие устройств.......................................................................................... |
337 |
|
Близкое знакомство с функцией CreateFile........................................................................ |
340 |
|
Флаги функции CreateFile, управляющие кэшированием........................................... |
343 |
|
Другие флаги функции CreateFile................................................................................. |
345 |
|
Флаги файловых атрибутов .......................................................................................... |
347 |
|
Работа с файлами ............................................................................................................... |
348 |
|
Определение размера файла ...................................................................................... |
349 |
|
Установка указателя в файле....................................................................................... |
350 |
|
Установка конца файла................................................................................................. |
352 |
|
Синхронный ввод-вывод на устройствах ........................................................................... |
353 |
|
Сброс данных на устройство ........................................................................................ |
354 |
|
Отмена синхронного ввода-вывода ............................................................................. |
354 |
|
Асинхронный ввод-вывод на устройствах: основы ........................................................... |
356 |
|
Структура OVERLAPPED .............................................................................................. |
357 |
|
Асинхронный ввод-вывод на устройствах: «подводные камни»................................ |
359 |
|
Отмена запросов ввода-вывода, ожидающих в очереди ........................................... |
361 |
|
Уведомление о завершении ввода-вывода ....................................................................... |
362 |
|
Освобождение объекта ядра «устройство»................................................................. |
363 |
|
Освобождение объекта ядра «событие» ..................................................................... |
365 |
|
Ввод-вывод с оповещением ......................................................................................... |
368 |
|
Порты завершения ввода-вывода................................................................................ |
375 |
|
Создание портов завершения ввода-вывода .............................................................. |
376 |
|
Связывание устройства с портом завершения ввода-вывода................................... |
377 |
|
Архитектура программ, использующих порты завершения ввода-вывода ............... |
380 |
|
Как порт завершения ввода-вывода управляет пулом потоков ................................. |
383 |
|
Сколько потоков должно быть в пуле? ........................................................................ |
385 |
|
Эмуляция выполненных запросов ввода-вывода ....................................................... |
387 |
|
Программа-пример FileCopy ......................................................................................... |
388 |
|
Глава 11. Пулы потоков.................................................................................................... |
397 |
|
Сценарий 1. Асинхронный вызов функций ........................................................................ |
398 |
|
Явное управление рабочими элементами................................................................... |
399 |
|
Программа-пример Batch.............................................................................................. |
401 |
|
Сценарий 2. Вызов функций через определенные интервалы времени ......................... |
405 |
|
Программа-пример TimedMsgBox ................................................................................ |
407 |
|
Сценарий 3. Вызов функций при освобождении отдельных объектов ядра ................... |
411 |
|
Сценарий 4. Вызов функций по завершении запросов |
|
|
асинхронного ввода-вывода ............................................................................................... |
414 |
|
Обработка завершения обратного вызова .................................................................. |
415 |
|
Настройка пула потоков ................................................................................................ |
417 |
|
Корректное разрушение пула потоков и группы очистки............................................ |
419 |
|
Глава 12. Волокна .............................................................................................................. |
422 |
|
Работа с волокнами............................................................................................................. |
423 |
|
Программа-пример Counter................................................................................................. |
426 |
Часть III Управление памятью .......................................................................... |
431 |
|
|
Глава 13. Архитектура памяти в Windows ..................................................................... |
432 |
|
Виртуальное адресное пространство процесса ................................................................ |
432 |
|
Как адресное пространство разбивается на разделы ...................................................... |
433 |
|
Раздел для выявления нулевых указателей ............................................................... |
434 |
|
Раздел для кода л данных пользовательского режима.............................................. |
434 |
Оглавление |
IX |
Раздел для кода и данных режима ядра ..................................................................... |
437 |
Регионы в адресном пространстве .............................................................................. |
437 |
Передача региону физической памяти ........................................................................ |
438 |
Физическая память в страничный файл............................................................................. |
440 |
Физическая память в страничном файле не хранится ............................................... |
442 |
Атрибуты защиты................................................................................................................. |
443 |
Защита типа «копирование при записи........................................................................ |
435 |
Специальные флаги атрибутов защиты ...................................................................... |
446 |
Подводя итоги ...................................................................................................................... |
446 |
Блоки внутри регионов .................................................................................................. |
452 |
Выравнивание данных......................................................................................................... |
455 |
Глава 14. Исследование виртуальной памяти ............................................................. |
460 |
Системная информация ...................................................................................................... |
460 |
Статус виртуальной памяти ................................................................................................ |
470 |
Управление памятью на компьютерах с архитектурой NUMA.......................................... |
471 |
Определение состояния адресного пространства ............................................................ |
475 |
Глава 15. Использование виртуальной памяти в приложениях ............................... |
487 |
Резервирование региона в адресном пространстве ......................................................... |
487 |
Передача памяти зарезервированному региону ............................................................... |
490 |
Резервирование региона с одновременной передачей физической памяти............ |
491 |
В какой момент региону передают физическую память ............................................. |
492 |
Возврат физической памяти и освобождение региона. .................................................... |
495 |
В какой момент физическую память возвращают системе ........................................ |
496 |
Изменение атрибутов защиты ...................................................................................... |
505 |
Сброс содержимого физической памяти ..................................................................... |
506 |
Механизм Address Windowing Extensions........................................................................... |
510 |
Глава 16. Стек потока ........................................................................................................ |
523 |
Функция из библиотеки С/С++ для контроля стека ........................................................... |
528 |
Программа-пример Summation ........................................................................................... |
530 |
Глава 17. Проецируемые в память файлы ................................................................... |
536 |
Проецирование в память EXE- и DLL-файлов................................................................... |
537 |
Статические данные не разделяются несколькими |
|
экземплярами EXE или DLL.......................................................................................... |
538 |
Файлы данных, проецируемые в память ........................................................................... |
550 |
Использование проецируемых в память файлов.............................................................. |
551 |
Обработка больших файлов ............................................................................................... |
570 |
Проецируемые файлы и когерентность ............................................................................. |
572 |
Базовый адрес файла, проецируемого в память .............................................................. |
573 |
Особенности проецирования файлов ................................................................................ |
575 |
Совместный доступ процессов к данным через механизм проецирования .................... |
576 |
Файлы, проецируемые на физическую память из страничного файла ........................... |
577 |
Частичная передача физической памяти проецируемым файлам .................................. |
583 |
Глава 18. Динамически распределяемая память ......................................................... |
598 |
Стандартная куча процесса ................................................................................................ |
599 |
Дополнительные кучи в процессе....................................................................................... |
600 |
Защита компонентов ..................................................................................................... |
600 |
Более эффективное управление памятью .................................................................. |
601 |
Локальный доступ.......................................................................................................... |
602 |
Исключение издержек связанных с синхронизацией потоков.................................... |
602 |
X |
Оглавление |
|
|
|
Быстрое освобождение всей памяти в куче ................................................................ |
602 |
|
|
Создание дополнительной кучи.......................................................................................... |
603 |
|
|
Выделение блока памяти из кучи................................................................................. |
605 |
|
|
Изменение размера блока ............................................................................................ |
607 |
|
|
Определение размера блока........................................................................................ |
608 |
|
|
Освобождение блока..................................................................................................... |
608 |
|
|
Уничтожение кучи .......................................................................................................... |
608 |
|
|
Использование куч в программах на С++ .................................................................... |
608 |
|
|
Другие функции управления кучами................................................................................... |
612 |
|
Часть IV |
Динамически подключаемые библиотеки ....................................... |
615 |
|
|
Глава 19. DLL: основы ...................................................................................................... |
616 |
|
|
DLL и адресное пространство процесса ............................................................................ |
617 |
|
|
Общая картина..................................................................................................................... |
619 |
|
|
Создание DLL-модуля ................................................................................................... |
622 |
|
|
Создание EXE-модуля .................................................................................................. |
628 |
|
|
Выполнение EXE-модуля.............................................................................................. |
632 |
|
|
Глава 20. DLL: более сложные методы программирования...................................... |
634 |
|
|
Явная загрузка DLL и связывание идентификаторов........................................................ |
634 |
|
|
Явная загрузка DLL ....................................................................................................... |
635 |
|
|
Явная выгрузка DLL....................................................................................................... |
639 |
|
|
Явное подключение экспортируемого идентификатора............................................. |
642 |
|
|
Функция входа/выхода......................................................................................................... |
643 |
|
|
Уведомление DLL_PROCESS_ATTACH ...................................................................... |
644 |
|
|
Уведомление DLL_PROCESS_DETACH ...................................................................... |
646 |
|
|
Уведомление DLL_THREAD_ATTACH ......................................................................... |
648 |
|
|
Уведомление DLL_THREAD_DETACH......................................................................... |
649 |
|
|
Как система упорядочивает вызовы DllMain................................................................ |
650 |
|
|
Функция DllMain и библиотека С/С++........................................................................... |
653 |
|
|
Отложенная загрузка DLL ................................................................................................... |
654 |
|
|
Программа-пример DelayLoadApp................................................................................ |
659 |
|
|
Переадресация вызовов функций ...................................................................................... |
666 |
|
|
Известные DLL ..................................................................................................................... |
667 |
|
|
Перенаправление DLL......................................................................................................... |
669 |
|
|
Модификация базовых адресов модулей .......................................................................... |
670 |
|
|
Связывание модулей........................................................................................................... |
677 |
|
|
Глава 21. Локальная память потока ............................................................................... |
681 |
|
|
Динамическая локальная память потока ........................................................................... |
682 |
|
|
Использование динамической TLS .............................................................................. |
684 |
|
|
Статическая локальная память потока .............................................................................. |
687 |
|
|
Глава 22. Внедрение DLL и перехват API-вызовов ..................................................... |
689 |
|
|
Пример внедрения DLL ....................................................................................................... |
690 |
|
|
Внедрение DI L с использованием реестра ....................................................................... |
692 |
|
|
Внедрение DLL с помощью ловушек.................................................................................. |
694 |
|
|
Утилита для сохранения позиций элементов на рабочем столе ............................... |
695 |
|
|
Внедрение DLL с помощью удаленных потоков..... ........................................................... |
707 |
|
|
Программа-пример injLib............................................................................................... |
711 |
|
|
Библиотека ImgWalk.dll ................................................................................................. |
718 |
|
|
Внедрение троянской DLL................................................................................................... |
720 |
|
|
Внедрение DLL как отладчика ............................................................................................ |
720 |
Оглавление |
XI |
Внедрение кода через функцию CreateProcess................................................................. |
721 |
Перехват APIвызовов: пример.......................................................................................... |
722 |
Перехват API-вызовов подменой кода......................................................................... |
723 |
Перехват API-вызовов с использованием раздела импорта...................................... |
723 |
Программа-пример LastMsgBoxInfo ............................................................................. |
728 |
Часть V Структурная обработка исключений .................................................. |
747 |
Глава 23. Обработчики завершения ............................................................................... |
748 |
Примеры использования обработчиков завершения........................................................ |
749 |
Funcenstein1................................................................................................................... |
750 |
Funcenstein2................................................................................................................... |
750 |
Funcenstein3................................................................................................................... |
752 |
Funcfurter1 ...................................................................................................................... |
753 |
Проверьте себя: FuncaDoodleDoo................................................................................ |
754 |
Funcenstein4................................................................................................................... |
756 |
Funcarama1 .................................................................................................................... |
757 |
Funcarama2 .................................................................................................................... |
758 |
Funcarama3 .................................................................................................................... |
758 |
Funcarama4: последний рубеж ..................................................................................... |
759 |
И еще о блоке finally ...................................................................................................... |
761 |
Funcfurter2 ...................................................................................................................... |
762 |
Программа-пример SEHTerm ....................................................................................... |
763 |
Глава 24. Фильтры и обработчики исключений .......................................................... |
769 |
Примеры использования фильтров и обработчиков исключений.................................... |
770 |
Funcmeister1................................................................................................................... |
770 |
Funcmeister2................................................................................................................... |
771 |
EXCEPTION_EXECUTE_HANDLER .................................................................................... |
773 |
Некоторые полезные примеры ..................................................................................... |
774 |
Глобальная раскрутка ................................................................................................... |
777 |
Остановка глобальной раскрутки ................................................................................. |
780 |
EXCEPTION_CONTINUE_EXECUTION .............................................................................. |
782 |
Будьте осторожны с EXCEPTION_CONTmUE_EXECUTION ...................................... |
783 |
EXCEPTION_CONTINUE_SEARCH .................................................................................... |
784 |
Функция GetExceptionCode ........................................................................................... |
786 |
Функция GetExceptionInformation .................................................................................. |
791 |
Программные исключения ............................................................................................ |
795 |
Глава 25. Необработанные исключения, векторная обработка |
|
исключений и исключения C++ ....................................................................................... |
799 |
Как работает функция UnhandkdExceptionFiker................................................................. |
802 |
Взаимодействие UnhandledExceptionFilter с WER ...................................................... |
805 |
Отладка по запросу ............................................................................................................. |
808 |
Программа-пример Spreadsheet ......................................................................................... |
811 |
Векторная обработка исключений и обработчики возобновления................................... |
823 |
Исключения С++ и структурные исключения.. ................................................................... |
825 |
Исключения и отладчик ....................................................................................................... |
827 |
Глава 26. Отчеты об ошибках и восстановление приложений.................................. |
831 |
Консоль Windows Error Reporting ........................................................................................ |
831 |
Программная генерация отчетов об ошибках в Windows ................................................. |
834 |
Отключение генерации и отправки отчетов................................................................. |
836 |
Настройка генерируемых для процесса отчетов о сбоях........................................... |
837 |
XII |
Оглавление |
|
|
Создание и настройка отчетов о сбоях........................................................................ |
838 |
|
Программа-пример Customized WER........................................................................... |
847 |
|
Автоматический перезапуск и восстановление приложений............................................ |
855 |
|
Автоматический перезапуск приложения .................................................................... |
855 |
|
Поддержка восстановления приложений .................................................................... |
856 |
Часть VI Приложения ......................................................................................... |
859 |
|
|
Приложение А. Среда разработки................................................................................... |
860 |
|
Заголовочный файл CmnHdr.h............................................................................................ |
860 |
|
Раздел Windows Version Build Option ........................................................................... |
861 |
|
Раздел Unicode Build Option.......................................................................................... |
861 |
|
Раздел Windows Definitions и диагностика уровня 4 ................................................... |
862 |
|
Вспомогательный макрос Pragma Message................................................................. |
862 |
|
Макрос chINRANGE ....................................................................................................... |
863 |
|
Макрос chBEGINTfeREADEX ........................................................................................ |
863 |
|
Моя реализация DebugBreak для платформы x86 ..................................................... |
865 |
|
Определение кодов программных исключений........................................................... |
865 |
|
Макрос chMB .................................................................................................................. |
865 |
|
Макросы chASSERT и chVERIFY.................................................................................. |
865 |
|
МакросchHANDLE_DLGMSG ........................................................................................ |
866 |
|
Макрос chSETDLGICONS.............................................................................................. |
866 |
|
Принудительное указание компоновщику входной функции (w)WinMain.................. |
866 |
|
Поддержка тем оформления Windows XP с помощью директивы pragma................ |
867 |
|
Приложение Б. Распаковщики сообщений, макросы |
|
|
для дочерних элементов управления и API-макросы ................................................ |
873 |
|
Макросы — распаковщики сообщений............................................................................... |
874 |
|
Макросы для дочерних элементов управления................................................................. |
876 |
|
API-макросы ......................................................................................................................... |
877 |
|
Об авторе ............................................................................................................................ |
878 |
Благодарности
Мы бы не смогли написать эту книгу без поддержки и технической помощи многих людей. Вот кого мы хотим поблагодарить особо.
Джеффри благодарит жену Кристин и сына Эйдана за безграничную любовь и поддержку.
Кристоф никогда бы не осилил пятое издание этой книги без любви и содействия своей жены Флоранс, а также неиссякаемого любопытства дочери Сели. Его кошки Канэль и Нуга также внесли свой вклад (уютным мурлыканьем). Теперь, когда книга закончена, Кристофу нечем будет оправдывать недостаток внимания к ним!
Чтобы написать такую книгу, мало личных усилий авторов. Джеффри и Кристоф выражают глубокую признательность сотрудникам 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, о которых много говорится в этой книге.