Основы
2-е издание, исправленное
и переработанное
Дейл Роджерсон
Оглавление
ОТ АВТОРА ........................................................................................................................................................................9
ВВЕДЕНИЕ........................................................................................................................................................................11
П
РЕДВАРИТЕЛЬНЫЕ ЗНАНИЯ
............................................................................................................................................11
Программисты, не заинтересованные в Windows — добро пожаловать!...........................................................11
C++...................................................................................................................................................................................12
Только обычный С++ .................................................................................................................................................12
П
РИМЕРЫ
..........................................................................................................................................................................12
Пример программы Tangram.....................................................................................................................................13
Стилистические соглашения ....................................................................................................................................13
П
ОЧЕМУ ПОЯВИЛАСЬ ЭТА КНИГА
?...................................................................................................................................13
Т
ЕХНИЧЕСКАЯ ПОДДЕРЖКА
.............................................................................................................................................14
1 ГЛАВА
КОМПОНЕНТЫ...............................................................................................................................................................15
П
РЕИМУЩЕСТВА ИСПОЛЬЗОВАНИЯ КОМПОНЕНТОВ
........................................................................................................16
Адаптация приложений.............................................................................................................................................16
Библиотеки компонентов..........................................................................................................................................16
Распределенные компоненты....................................................................................................................................17
Т
РЕБОВАНИЯ К КОМПОНЕНТАМ
.......................................................................................................................................17
Динамическая компоновка.........................................................................................................................................17
Инкапсуляция ..............................................................................................................................................................17
COM.................................................................................................................................................................................19
Компоненты СОМ — это… ......................................................................................................................................19
СОМ — это не….........................................................................................................................................................20
Библиотека СОМ........................................................................................................................................................20
Стиль СОМ .................................................................................................................................................................20
СОМ дает больше, чем необходимо .........................................................................................................................20
З
АКЛЮЧИТЕЛЬНЫЕ ЗАМЕЧАНИЯ О КО МПОНЕНТАХ
..........................................................................................................21
2 ГЛАВА
ИНТЕРФЕЙС....................................................................................................................................................................23
И
НТЕРФЕЙСЫ
—
ЭТО ВСЕ
................................................................................................................................................23
Повторное использование архитектур приложений..............................................................................................23
Другие преимущества интерфейсов СОМ...............................................................................................................24
Р
ЕАЛИЗАЦИЯ ИНТЕРФЕЙСА
СОМ ....................................................................................................................................24
Соглашения о кодировании........................................................................................................................................25
Законченный пример...................................................................................................................................................26
Взаимодействие в обход интерфейсов ....................................................................................................................28
Детали реализации.....................................................................................................................................................28
Т
ЕОРИЯ ИНТЕРФЕЙСОВ
,
ЧАСТЬ
II .....................................................................................................................................29
Интерфейсы не изменяются.....................................................................................................................................30
Полиморфизм..............................................................................................................................................................30
Ч
ТО ЗА ИНТЕРФЕЙСОМ
.....................................................................................................................................................30
Таблица виртуальных функций .................................................................................................................................30
Указатели vtbl и данные экземпляра ........................................................................................................................31
Множественные экземпляры ....................................................................................................................................32
Разные классы, одинаковые vtbl................................................................................................................................32
К
ИРПИЧИКИ
СОМ,
РЕЗЮМЕ
.............................................................................................................................................34
4
3 ГЛАВА
QUERYINTERFACE........................................................................................................................................................ 35
З
АПРОС ИНТЕРФЕЙСА
....................................................................................................................................................... 36
IUnknown..................................................................................................................................................................... 36
Получение указателя на IUnknown........................................................................................................................... 36
Знакомство с QueryInterface..................................................................................................................................... 37
Использование QueryInterface ................................................................................................................................... 37
Реализация QueryInterface......................................................................................................................................... 37
А теперь все вместе ..................................................................................................................................................40
П
РАВИЛА И СОГЛАШЕНИЯ
Q
UERY
I
NTERFACE
................................................................................................................... 43
Вы всегда получаете один и тот же IUnknown .....................................................................................................44
Вы можете получить интерфейс снова, если смогли получить его раньше....................................................... 44
Вы можете снова получить интерфейс, который у Вас уже есть.....................................................................44
Вы всегда можете вернуться туда, откуда начали.............................................................................................. 45
Если Вы смогли попасть куда-то хоть откуда-нибудь, Вы можете попасть туда откуда угодно................ 45
Q
UERY
I
NTERFACE ОПРЕДЕЛЯЕТ КОМПОНЕНТ
................................................................................................................... 46
Вы не можете воспользоваться всеми знаниями сразу......................................................................................... 46
Р
АБОТА С НОВЫМИ ВЕРСИЯМИ КОМПОНЕНТОВ
............................................................................................................... 46
Когда нужно создавать новую версию.................................................................................................................... 47
Имена версий интерфейсов.......................................................................................................................................48
Неявные соглашения ..................................................................................................................................................48
«У В
АС ДВЕ НОГИ
?» ........................................................................................................................................................ 48
4 ГЛАВА
ПОДСЧЕТ ССЫЛОК...................................................................................................................................................... 51
У
ПРАВЛЕНИЕ ВРЕМЕНЕМ ЖИЗНИ
..................................................................................................................................... 51
П
ОДСЧЕТ ССЫЛОК
............................................................................................................................................................ 52
Подсчет ссылок на отдельные интерфейсы...........................................................................................................53
Реализация AddRef и Release ..................................................................................................................................... 54
К
ОГДА ПОДСЧИТЫВАТЬ ССЫЛКИ
..................................................................................................................................... 59
Оптимизация подсчета ссылок................................................................................................................................59
Правила подсчета ссылок ......................................................................................................................................... 61
А
МУНИЦИЯ ПОЖАРНОГО
,
РЕЗЮМЕ
.................................................................................................................................. 62
5 ГЛАВА
ДИНАМИЧЕСКАЯ КОМПОНОВКА .......................................................................................................................... 65
С
ОЗДАНИЕ КОМПОНЕНТА
................................................................................................................................................. 65
Экспорт функции из DLL .......................................................................................................................................... 65
Загрузка DLL............................................................................................................................................................... 67
Р
АЗБИВАЕМ МОНОЛИТ
..................................................................................................................................................... 68
Тексты программ....................................................................................................................................................... 69
С
ВЯЗКИ ОБЪЕКТОВ
........................................................................................................................................................... 72
Н
ЕГИБКОЕ СВЯЗЫВАНИЕ
,
РЕЗЮМЕ
................................................................................................................................... 73
6 ГЛАВА
HRESULT, GUID, РЕЕСТР И ДРУГИЕ ДЕ ТАЛИ .................................................................................................... 75
HRESULT........................................................................................................................................................................ 75
Поиск HRESULT .........................................................................................................................................................77
Использование HRESULT .......................................................................................................................................... 78
Определение собственных кодов ошибки ................................................................................................................ 79
GUID................................................................................................................................................................................ 80
Зачем нужен GUID? ..................................................................................................................................................80
Объявление и определение GUID .............................................................................................................................. 81
Сравнение GUID......................................................................................................................................................... 82
Использование GUID в качестве идентификаторов компонентов...................................................................... 82
Передача GUID по ссылке.........................................................................................................................................82
Р
ЕЕСТР
W
INDOWS
............................................................................................................................................................ 82
Организация Реестра ................................................................................................................................................ 82
Редактор Реестра ..................................................................................................................................................... 82
Необходимый минимум..............................................................................................................................................83
5
Другие детали Реестра .............................................................................................................................................83
ProgID..........................................................................................................................................................................84
Саморегистрация.......................................................................................................................................................85
Категории компонентов ...........................................................................................................................................86
OleView ........................................................................................................................................................................87
Н
ЕКОТОРЫЕ ФУНКЦИИ БИБЛИОТЕКИ
COM .....................................................................................................................87
Инициализация библиотеки COM .............................................................................................................................87
Управление памятью .................................................................................................................................................88
Преобразование строк в GUID .................................................................................................................................88
Р
ЕЗЮМЕ
............................................................................................................................................................................89
7 ГЛАВА
ФАБРИКА КЛАССА .......................................................................................................................................................91
C
O
C
REATE
I
NSTANCE
..........................................................................................................................................................91
Прототип CoCreateInstance .....................................................................................................................................91
Использование CoCreateInstance...............................................................................................................................92
Контекст класса ........................................................................................................................................................92
Листинг кода клиента ...............................................................................................................................................93
Но CoCreateInstance недостаточно гибка...............................................................................................................94
Ф
АБРИКИ КЛАССА
............................................................................................................................................................94
Использование CoGetClassObject..............................................................................................................................95
IClassFactory ...............................................................................................................................................................95
CoCreateInstance vs. CoGetClassObject.....................................................................................................................96
Фабрики класса инкапсулируют создание компонентов ........................................................................................96
Р
ЕАЛИЗАЦИЯ ФАБРИКИ КЛАССА
.......................................................................................................................................97
Использование DllGetClassObject..............................................................................................................................97
Общая картина...........................................................................................................................................................97
Листинг кода компонента ........................................................................................................................................98
Последовательность выполнения...........................................................................................................................103
Регистрация компонента........................................................................................................................................103
Н
ЕСКОЛЬКО КОМПОНЕНТОВ В ОДНОЙ
DLL ...................................................................................................................104
Повторное применение реализации фабрики класса ............................................................................................104
В
ЫГРУЗКА
DLL ..............................................................................................................................................................105
Использование DllCanUnloadNow...........................................................................................................................105
LockServer..................................................................................................................................................................105
Р
ЕЗЮМЕ
..........................................................................................................................................................................106
8 ГЛАВА
ПОВТОРНАЯ ПРИМЕНИМОСТЬ КОМПОНЕНТОВ: ВКЛЮЧЕНИЕ И АГРЕГИРОВАНИЕ ...................107
В
КЛЮЧЕНИЕ И АГРЕГИРОВАНИЕ
....................................................................................................................................108
Включение..................................................................................................................................................................108
Агрегирование ...........................................................................................................................................................108
Сравнение включения и агрегирования ...................................................................................................................109
Р
ЕАЛИЗАЦИЯ ВКЛЮЧЕНИЯ
.............................................................................................................................................109
Расширение интерфейсов........................................................................................................................................111
Р
ЕАЛИЗАЦИЯ АГРЕГИРОВАНИЯ
......................................................................................................................................112
Магия QueryInterface................................................................................................................................................113
Неверный IUnknown..................................................................................................................................................114
Интерфейсы IUnknown для агрегирования............................................................................................................115
Создание внутреннего компонента........................................................................................................................117
Указатели внешнего компонента на интерфейсы внутреннего компонента ...................................................119
З
АКОНЧЕННЫЙ ПРИМЕР
..................................................................................................................................................121
Слепое агрегирование...............................................................................................................................................1 31
А
ГРЕГИРОВАНИЕ И ВКЛЮЧЕНИЕ В РЕАЛЬНОМ МИРЕ
......................................................................................................133
Предоставление информации о внутреннем состоянии ......................................................................................133
Моделирование виртуальных функций...................................................................................................................134
Р
ЕЗЮМЕ
..........................................................................................................................................................................135
9 ГЛАВА
БУДЕМ ПРОЩЕ.............................................................................................................................................................137
У
ПРОЩЕНИЯ НА КЛИЕНТСКОЙ СТОРОНЕ
........................................................................................................................137