Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание эффективных приложений для Windows Джеффри Рихтер 2004 (Книга).pdf
Скачиваний:
346
Добавлен:
15.06.2014
Размер:
8.44 Mб
Скачать

WINDOWS

 

СОЗДАНИЕ ЭФФЕКТИВНЫХ

 

WIN32-ПРИЛОЖЕНИЙ

 

Джеффри Рихтер

 

ЧАCTЬ I МАТЕРИАЛЫ ДЛЯ ОБЯЗАТЕЛЬНОГО ЧТЕНИЯ...................................................

8

ГЛАВА 1. Обработка ошибок ..................................................................................................

8

Вы тоже можете это сделать...............................................................................................

12

Программа-пример ErrorShow............................................................................................

13

ГЛАВА 2 Unicode ....................................................................................................................

14

Наборы символов.................................................................................................................

14

Одно- и двухбайтовые наборы символов......................................................................

14

Unicode: набор широких символов ................................................................................

15

Почему Unicode?..................................................................................................................

16

Windows 2000 и Unicode .....................................................................................................

16

Windows 98 и Unicode .........................................................................................................

17

Windows CE и Unicode ........................................................................................................

18

В чью пользу счет? ..............................................................................................................

18

Unicode и СОМ ....................................................................................................................

18

Как писать программу с использованием Unicode...........................................................

19

Unicode и библиотека С ..................................................................................................

19

Типы данных, определенные в Windows для Unicode .................................................

21

Unicode- и ANSI-функции в Windows ...........................................................................

21

Строковые функции Windows ........................................................................................

23

Создание программ, способных использовать и ANSI, и Unicode .................................

23

Ресурсы .............................................................................................................................

26

Текстовые файлы .............................................................................................................

27

Перекодировка строк из Unicode в ANSI и обратно ....................................................

28

ГЛАВА 3 Объекты ядра ..........................................................................................................

31

Что такое объект ядра .........................................................................................................

31

Учет пользователей объектов ядра ................................................................................

32

Защита...............................................................................................................................

33

Таблица описателей объектов ядра ...................................................................................

35

Создание объекта ядра ....................................................................................................

35

Закрытие объекта ядра ....................................................................................................

37

Совместное использование объектов ядра несколькими процессами ...........................

38

Наследование описателя объекта...................................................................................

38

Изменение флагов описателя .........................................................................................

41

Именованные объекты ....................................................................................................

42

Дублирование описателей объектов..............................................................................

46

ЧАСТЬ II НАЧИНАЕМ РАБОТАТЬ .........................................................................................

50

ГЛАВА 4 Процессы.................................................................................................................

51

Ваше первое Windows-приложение...................................................................................

52

Описатель экземпляра процесса ....................................................................................

55

Описатель предыдущего экземпляра процесса ............................................................

57

Командная строка процесса............................................................................................

57

Переменные окружения ..................................................................................................

58

Привязка к процессорам .................................................................................................

61

Режим обработки ошибок ...............................................................................................

61

Текущие диск и каталог для процесса ...........................................................................

62

Текущие каталоги для процесса.....................................................................................

62

Определение версии системы.........................................................................................

63

Функция CreateProcess ........................................................................................................

67

Параметры pszApplicationName и pszCommandLine....................................................

67

Параметры psaProcess, psaThread и blnheritHandles .....................................................

69

Параметр fdwCreate .........................................................................................................

70

Параметр pvEnvironment.................................................................................................

72

Параметр pszCurDir .........................................................................................................

72

Параметр psiStartlnfo .......................................................................................................

72

Параметр ppiProclnfo.......................................................................................................

76

Завершение процесса ..........................................................................................................

78

Возврат управления входной функцией первичного потока ......................................

78

Функция ExitProcess ........................................................................................................

78

Функция TerminateProcess ..............................................................................................

80

Когда все потоки процесса уходят.................................................................................

80

Что происходит при завершении процесса ...................................................................

81

Дочерние процессы .............................................................................................................

81

Запуск обособленных дочерних процессов ..................................................................

83

Перечисление процессов, выполняемых в системе .........................................................

84

Программа-пример Processlnfo ......................................................................................

84

ГЛАВА 5 Задания ....................................................................................................................

87

Определение ограничений, налагаемых на процессы в задании ....................................

90

Включение процесса в задание ..........................................................................................

96

Завершение всех процессов в задании ..............................................................................

97

Получение статистической информации о задании.........................................................

97

Уведомления заданий........................................................................................................

101

Программа-пример JobLab ...............................................................................................

103

ГЛАВА 6 Базовые сведения о потоках................................................................................

104

В каких случаях потоки создаются..................................................................................

105

И в каких случаях потоки не создаются..........................................................................

107

Ваша первая функция потока ...........................................................................................

108

Функция CreateThread .......................................................................................................

108

Параметр psa ..................................................................................................................

109

Параметр cbStack ...........................................................................................................

109

Параметры pfnStartAddr и pvParam..............................................................................

110

Параметр fdwCreate .......................................................................................................

111

Параметр pdwThreadlD .................................................................................................

111

Завершение потока ............................................................................................................

112

Возврат управления функцией потока ........................................................................

112

Функция ExitThread.......................................................................................................

112

Функция TerminateThread .............................................................................................

113

Если завершается процесс ............................................................................................

113

Что происходит при завершении потока.....................................................................

114

Кое-что о внутреннем устройстве потока .......................................................................

114

Некоторые соображения по библиотеке С/С++ .............................................................

117

Ой, вместо _beginthreadex я по ошибке вызвал CreateThread ...................................

126

Библиотечные функции, которые лучше не вызывать ..............................................

126

Как узнать о себе ...............................................................................................................

127

Преобразование псевдоописателя в настоящий описатель .......................................

128

ГЛАВА 7 Планирование потоков, приоритет и привязка к процессорам .......................

130

Приостановка и возобновление потоков.........................................................................

131

Приостановка и возобновление процессов .....................................................................

132

Функция Sleep ....................................................................................................................

134

Переключение потоков .....................................................................................................

134

Определение периодов выполнения потока ...................................................................

135

Структура CONTEXT........................................................................................................

138

Приоритеты потоков .........................................................................................................

142

Абстрагирование приоритетов.........................................................................................

143

Программирование приоритетов .....................................................................................

147

Динамическое изменение уровня приоритета потока ...............................................

149

Подстройка планировщика для активного процесса .................................................

151

Программа-пример Scheduling Lab ..............................................................................

152

Привязка потоков к процессорам.................................................................................

153

ГЛАВА 8 Синхронизация потоков в пользовательском режиме......................................

158

Атомарный доступ: семейство Inferlockect-функций ....................................................

158

Кэш-линии..........................................................................................................................

164

Более сложные методы синхронизации потоков............................................................

165

Худшее, что можно сделать .........................................................................................

166

Критические секции ..........................................................................................................

168

Критические секции: важное дополнение...................................................................

171

Критические секции и спин-блокировка.....................................................................

174

Критические секции и обработка ошибок ..................................................................

175

Несколько полезных приемов ......................................................................................

175

ГЛАВА 9 Синхронизация потоков с использованием объектов ядра..............................

179

Wait-функции .....................................................................................................................

181

Побочные эффекты успешного ожидания ......................................................................

184

События ..............................................................................................................................

185

Программа-пример Handshake .....................................................................................

189

Ожидаемые таймеры .........................................................................................................

191

Ожидаемые таймеры и АРС-очередь ..............................................................................

194

И еще кое-что о таймерах .............................................................................................

196

Семафоры ...........................................................................................................................

197

Мьютексы...........................................................................................................................

199

Отказ от объекта-мьютекса ..........................................................................................

201

Мьютексы и критические секции ....................................................................................

201

Программа-пример Queue.............................................................................................

202

Сводная таблица объектов, используемых для синхронизации потоков.....................

205

Другие функции, применяемые в синхронизации потоков...........................................

206

Асинхронный ввод-вывод на устройствах..................................................................

206

Функция WaitForlnputldle .............................................................................................

206

Функция MsgWaitForMultipleObjects(Ex) ...................................................................

207

Функция WaitForDebugEvent .......................................................................................

207

Функция SignalObjectAndWait .....................................................................................

208

ГЛАВА 10 Полезные средства для синхронизации потоков ............................................

209

Реализация критической секции: объект-оптекс............................................................

210

Программа-пример Optex .............................................................................................

212

Создание инверсных семафоров и типов данных, безопасных в многопоточной среде

.............................................................................................................................................

213

Программа-пример lnterlockedType .............................................................................

218

Синхронизация в сценарии "один писатель/группа читателей" ...................................

218

Программа-пример SWMRG ........................................................................................

220

Реализация функции WaitForMultipleExpressions ..........................................................

221

Программа-пример WaitForMultExp............................................................................

223

ГЛАВА 11 Пулы потоков .....................................................................................................

227

Сценарий 1: асинхронный вызов функций .....................................................................

228

Сценарий 2: вызов функций через определенные интервалы времени .......................

231

Программа-пример TimedMsgBox ...............................................................................

234

Сценарий 3: вызов функций при освобождении отдельных объектов ядра ................

235

Сценарий 4; вызов функций по завершении запросов на асинхронный ввод-вывод .237

ГЛАВА 12 Волокна ...............................................................................................................

239

Работа с волокнами ...........................................................................................................

239

Программа-пример Counter ..........................................................................................

242

ЧАСТЬ III УПРАВЛЕНИЕ ПАМЯТЬЮ..................................................................................

244

ГЛАВА 13 Архитектура памяти в Windows .......................................................................

244

Виртуальное адресное пространство процесса ..............................................................

245

Как адресное пространство разбивается на разделы .....................................................

245

Раздел для выявления нулевых указателей (Windows 2000 и Windows 98) ............

246

Раздел для совместимости с программами DOS и 16-разрядной Windows (только

Windows 98) ...................................................................................................................

247

Раздел для кода и данных пользовательского режима (Windows 2000 и Windows 98)

.........................................................................................................................................

247

Закрытый раздел размером 64 Кб (только Windows 2000)........................................

249

Раздел для общих MMF (только Windows 98)............................................................

249

Раздел для кода и данных режима ядра (Windows 2000 и Windows 98) ..................

249

Регионы в адресном пространстве ...................................................................................

250

Передача региону физической памяти ............................................................................

251

Физическая память и страничный файл ..........................................................................

251

Физическая память в страничном файле не хранится ...............................................

254

Атрибуты защиты ..............................................................................................................

255

Защита типа «копирование при записи» .....................................................................

256

Специальные флаги атрибутов защиты.......................................................................

257

Подводя итоги....................................................................................................................

257

Блоки внутри регионов .................................................................................................

260

Особенности адресного пространства в Windows 98.................................................

265

Выравнивание данных ......................................................................................................

269

ГЛАВА 14 Исследование виртуальной памяти ..................................................................

273

Системная информация ....................................................................................................

273

Программа-пример Syslnfo ...........................................................................................

275

Статус виртуальной памяти..............................................................................................

275

Программа-пример VMStat ..........................................................................................

277

Определение состояния адресного пространства...........................................................

278

Функция VMQuery ........................................................................................................

279

Программа-пример VMMap .........................................................................................

281

ГЛАВА 15 Использование виртуальной памяти в приложениях .....................................

284

Резервирование региона в адресном пространстве ........................................................

284

Передача памяти зарезервированному региону .............................................................

286

Резервирование региона с одновременной передачей физической памяти.................

287

В какой момент региону передают физическую память ...............................................

287

Возврат физической памяти и освобождение региона ..................................................

289

В какой момент физическую память возвращают системе .......................................

290

Программа-пример VMAIloc........................................................................................

291

Изменение атрибутов защиты ..........................................................................................

293

Сброс содержимого физической памяти.........................................................................

294

Программа-пример MemReset......................................................................................

296

Механизм Address Windowing Extensions (только Windows 2000)...............................

297

Программа-пример AWE ..............................................................................................

301

ГЛАВА 16 Стек потока .........................................................................................................

302

Стек потока в Windows 98 ................................................................................................

305

Функция из библиотеки С/С++ для контроля стека.......................................................

307

Программа-пример Summation.........................................................................................

309

ГЛАВА 17 Проецируемые в память файлы ........................................................................

311

Проецирование в память EXE- и DLL-файлов ...............................................................

311

Статические данные не разделяются несколькими экземплярами EXE или DLL ..313

Статические данные разделяются несколькими экземплярами EXE или DLL.......

315

Программа-пример Applnst ..........................................................................................

319

Файлы данных, проецируемые в память .........................................................................

321

Метод 1: один файл, один буфер .................................................................................

321

Метод 2: два файла, один буфер ..................................................................................

321

Метод 3: один файл, два буфера ..................................................................................

322

Метод 4: один файл и никаких буферов......................................................................

322

Использование проецируемых в память файлов ............................................................

322

Этап1: создание или открытие объекта ядра «файл».................................................

323

Этап 2: создание объекта ядра «проекция файла» .....................................................

324

Этап 3: проецирование файловых данных на адресное пространство процесса ....

327

Этап 4: отключение файла данных от адресного пространства процесса ...............

329

Этапы 5 и 6: закрытие объектов «проекция файла» и «файл» ..................................

331

Программа-пример FileRev ..........................................................................................

331

Обработка больших файлов .............................................................................................

334

Проецируемые файлы и когерентность...........................................................................

336

Базовый адрес файла, проецируемого в память .............................................................

337

Особенности проецирования файлов на разных платформах.......................................

338

Совместный доступ процессов к данным через механизм проецирования.................

341

Файлы, проецируемые на физическую память из страничного файла ........................

342

Программа-пример MMFShare.....................................................................................

343

Частичная передача физической памяти проецируемым файлам ................................

344

Программа-пример MMFSparse ...................................................................................

345

ГЛАВА 18 Динамически распределяемая память..............................................................

349

Стандартная куча процесса ..............................................................................................

349

Дополнительные кучи в процессе....................................................................................

350

Защита компонентов .....................................................................................................

350

Более эффективное управление памятью ...................................................................

351

Локальный доступ .........................................................................................................

352

Исключение издержек, связанных с синхронизацией потоков.................................

352

Быстрое освобождение всей памяти в куче ................................................................

353

Создание дополнительной кучи ...................................................................................

353

Выделение блока памяти из кучи ................................................................................

354

Изменение размера блока .............................................................................................

355

Определение размера блока..........................................................................................

356

Освобождение блока .....................................................................................................

356

Уничтожение кучи.........................................................................................................

357

Использование куч в программах на С++ ...................................................................

357

Другие функции управления кучами...............................................................................

361

ЧАСТЬ IV ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ ...................................

363

ГЛАВА 19 DLL: основы .......................................................................................................

363

DLL и адресное пространство процесса..........................................................................

364

Общая картина ...................................................................................................................

366

Создание DLL-модуля.......................................................................................................

369

Что такое экспорт ..........................................................................................................

370

Создание DLL для использования с другими средствами разработки (отличными от

Visual C++) .....................................................................................................................

372

Создание ЕХЕ-модуля.......................................................................................................

373

Что такое импорт ...........................................................................................................

374

Выполнение ЕХЕ-модуля .................................................................................................

376

ГЛАВА 20 DLL: более сложные методы программирования...........................................

377

Явная загрузка DLL и связывание идентификаторов ....................................................

378

Явная загрузка DLL.......................................................................................................

378

Явная выгрузка DLL......................................................................................................

380

Явное подключение экспортируемого идентификатора ...........................................

382

Функция входа/выхода......................................................................................................

383

Уведомление DLL_PROCESS_ATTACH ....................................................................

385

Уведомление DLL_PROCESS_DETACH ....................................................................

386

Уведомление DLL_THREAD_ATTACH .....................................................................

388

Уведомление DLL_THREAD_DETACH .....................................................................

389

Как система упорядочивает вызовы DIIMain .............................................................

390

Функция DllMain и библиотека С/С++........................................................................

393

Отложенная загрузка DLL ................................................................................................

394

Программа-пример DelayLoadApp ..............................................................................

398

Переадресация вызовов функций ....................................................................................

399

Известные DLL ..................................................................................................................

400

Перенаправление DLL ......................................................................................................

402

Модификация базовых адресов модулей ........................................................................

402

Связывание модулей .........................................................................................................

408

ГЛАВА 21 Локальная память потока ..................................................................................

410

Динамическая локальная память потока.........................................................................

411

Использование динамической TLS..............................................................................

413

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

416

ГЛАВА 22 Внедрение DLL и перехват API-вызовов.........................................................

417

Пример внедрения DLL ....................................................................................................

418

Внедрение DLL c использованием реестра.....................................................................

420

Внедрение DLL с помощью ловушек ..............................................................................

422

Утилита для сохранения позиций элементов на рабочем столе ...............................

423

Внедрение DLL с помощью удаленных потоков ...........................................................

426

Программа-пример lnjLib .............................................................................................

430

Библиотека lmgWalk.dll ................................................................................................

431

Внедрение троянской DLL ...............................................................................................

433

Внедрение DLL как отладчика.........................................................................................

434

Внедрение кода в среде Windows 98 через проецируемый в память файл..................

434

Внедрение кода через функцию CreateProcess ...............................................................

434

Перехват API-вызовов: пример ........................................................................................

435

Перехват API-вызовов подменой кода ........................................................................

436

Перехват API-вызовов с использованием раздела импорта......................................

436

Программа-пример LastMsgBoxlnfo ............................................................................

440

ЧАСТЬ V СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧЕНИЙ ................................................

442

ГЛАВА 23 Обработчики завершения ..................................................................................

442

Примеры использования обработчиков завершения .....................................................

443

Funcenstein1....................................................................................................................

443

Funcenstein2....................................................................................................................

444

Funcenstein3....................................................................................................................

446

Funcfurter1 ......................................................................................................................

447

Проверьте себя: FuncaDoodleDoo ................................................................................

447

Funcenstein4....................................................................................................................

449

Funcarama1 .....................................................................................................................

450

Funcarama2 .....................................................................................................................

451

Funcarama3 .....................................................................................................................

451

Funcarama4: последний рубеж......................................................................................

453

И еще о блоке finally .....................................................................................................

454

Funcfurter2 ......................................................................................................................

455

Программа-пример SEHTerm .......................................................................................

456

ГЛАВА 24 Фильтры и обработчики исключений ..............................................................

458

Примеры использования фильтров и обработчиков исключений ................................

458

Funcmeister1 ...................................................................................................................

459

Funcmeister2 ...................................................................................................................

459

EXCEPTION_EXECUTE_HANDLER..............................................................................

462

Некоторые полезные примеры .....................................................................................

463

Глобальная раскрутка....................................................................................................

466

Остановка глобальной раскрутки ................................................................................

469

EXCEPTION_CONTINUE_EXECUTION........................................................................

471

Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION ................................

472

EXCEPTION_CONTINUE_SEARCH...............................................................................

473

Функция GetExceptionCode ..............................................................................................

476

Функция GetExceptionlnformation ....................................................................................

480

Программные исключения ...............................................................................................

484

ГЛАВА 25 Необработанные исключения и исключения С++ ..........................................

487

Отладка по запросу............................................................................................................

490

Отключение вывода сообщений об исключении ...........................................................

491

Принудительное завершение процесса .......................................................................

491

Создание оболочки вокруг функции потока...............................................................

491

Создание оболочки вокруг всех функций потоков ....................................................

492

Автоматический вызов отладчика ...............................................................................

492

Явный вызов функции UnhandledExceptionFilter ...........................................................

493

Функция UnhandledExceptionFilter изнутри....................................................................

494

Исключения и отладчик ....................................................................................................

495

Программа-пример Spreadsheet....................................................................................

498

Исключения С++ и структурные исключения................................................................

501

Перехват структурных исключений в С++ .................................................................

503

ЧАСТЬ VI ОПЕРАЦИИ С ОКНАМИ......................................................................................

507

ГЛАВА 26 Оконные сообщения ..........................................................................................

507

Очередь сообщений потока ..............................................................................................

508

Посылка асинхронных сообщений в очередь потока ....................................................

508

Посылка синхронных сообщений окну...........................................................................

510

Пробуждение потока .........................................................................................................

515

Флаги состояния очереди .............................................................................................

516

Алгоритм выборки сообщений из очереди потока ....................................................

517

Пробуждение потока с использованием объектов ядра или флагов состояния

очереди ...........................................................................................................................

521

Передача данных через сообщения .................................................................................

524

Программа-пример CopyData .......................................................................................

527

Как Windows манипулирует с ANSI/Unicode-символами и строками .........................

527

ГЛАВА 27 Модель аппаратного ввода и локальное состояние ввода .............................

529