Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Роджерсон Д. - Основы COM - 2000.pdf
Скачиваний:
412
Добавлен:
13.08.2013
Размер:
2.4 Mб
Скачать

Основы

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

ПРАВИЛА И СОГЛАШЕНИЯ QUERYINTERFACE...................................................................................................................

43

Вы всегда получаете один и тот же IUnknown .....................................................................................................

44

Вы можете получить интерфейс снова, если смогли получить его раньше.......................................................

44

Вы можете снова получить интерфейс, который у Вас уже есть.....................................................................

44

Вы всегда можете вернуться туда, откуда начали..............................................................................................

45

Если Вы смогли попасть куда-то хоть откуда-нибудь, Вы можете попасть туда откуда угодно................

45

QUERYINTERFACE ОПРЕДЕЛЯЕТ КОМПОНЕНТ ...................................................................................................................

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

РЕЕСТР WINDOWS ............................................................................................................................................................

82

Организация Реестра ................................................................................................................................................

82

Редактор Реестра .....................................................................................................................................................

82

Необходимый минимум..............................................................................................................................................

83

 

5

Другие детали Реестра .............................................................................................................................................

83

ProgID..........................................................................................................................................................................

84

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

85

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

86

OleView ........................................................................................................................................................................

87

НЕКОТОРЫЕ ФУНКЦИИ БИБЛИОТЕКИ COM .....................................................................................................................

87

Инициализация библиотеки COM .............................................................................................................................

87

Управление памятью .................................................................................................................................................

88

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

88

РЕЗЮМЕ ............................................................................................................................................................................

89

7 ГЛАВА

 

ФАБРИКА КЛАССА .......................................................................................................................................................

91

COCREATEINSTANCE..........................................................................................................................................................

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

Слепое агрегирование...............................................................................................................................................

131

АГРЕГИРОВАНИЕ И ВКЛЮЧЕНИЕ В РЕАЛЬНОМ МИРЕ......................................................................................................

133

Предоставление информации о внутреннем состоянии......................................................................................

133

Моделирование виртуальных функций...................................................................................................................

134

РЕЗЮМЕ ..........................................................................................................................................................................

135

9 ГЛАВА

 

БУДЕМ ПРОЩЕ.............................................................................................................................................................

137

УПРОЩЕНИЯ НА КЛИЕНТСКОЙ СТОРОНЕ........................................................................................................................

137

6

 

Smart-указатели на интерфейсы............................................................................................................................

137

Классы-оболочки C++ .............................................................................................................................................

145

УПРОЩЕНИЯ НА СЕРВЕРНОЙ СТОРОНЕ ..........................................................................................................................

146

Базовый класс CUnknown ........................................................................................................................................

146

Базовый класс CFactory...........................................................................................................................................

149

Использование CUnknown и CFactory ....................................................................................................................

152

Все вместе, шаг за шагом .......................................................................................................................................

156

РЕЗЮМЕ..........................................................................................................................................................................

157

10 ГЛАВА

 

СЕРВЕРЫ В EXE ...........................................................................................................................................................

159

РАЗНЫЕ ПРОЦЕССЫ........................................................................................................................................................

159

Локальный вызов процедуры...................................................................................................................................

160

Маршалинг................................................................................................................................................................

160

DLL заместителя/заглушки ....................................................................................................................................

161

ВВЕДЕНИЕ В IDL/MIDL.................................................................................................................................................

161

IDL .............................................................................................................................................................................

162

Примеры описаний интерфейсов на IDL ...............................................................................................................

162

Компилятор MIDL ...................................................................................................................................................

166

РЕАЛИЗАЦИЯ ЛОКАЛЬНОГО СЕРВЕРА.............................................................................................................................

168

Работа примера программы...................................................................................................................................

169

Нет точек входа ......................................................................................................................................................

169

Запуск фабрик класса ..............................................................................................................................................

169

Изменения в LockServer ...........................................................................................................................................

172

УДАЛЕННЫЙ СЕРВЕР ......................................................................................................................................................

173

Что делает DCOMCNFG.EXE? .............................................................................................................................

174

Но как это работает?............................................................................................................................................

174

Другая информация DCOM .....................................................................................................................................

175

РЕЗЮМЕ..........................................................................................................................................................................

177

11 ГЛАВА

 

ДИСПЕТЧЕРСКИЕ ИНТЕРФЕЙСЫ И АВТОМАТИЗАЦИЯ ............................................................................

179

НОВЫЙ СПОСОБ ОБЩЕНИЯ.............................................................................................................................................

179

Старый способ общения .........................................................................................................................................

180

IDispatch, или «Я диспетчер, ты диспетчер…»....................................................................................................

180

ИСПОЛЬЗОВАНИЕ IDISPATCH .........................................................................................................................................

183

Параметры Invoke ...................................................................................................................................................

184

Примеры....................................................................................................................................................................

187

Тип VARIANT ............................................................................................................................................................

188

Тип данных BSTR......................................................................................................................................................

190

Тип данных SAFEARRAY..........................................................................................................................................

190

БИБЛИОТЕКИ ТИПА ........................................................................................................................................................

191

Создание библиотеки типа.....................................................................................................................................

191

Использование библиотек типа .............................................................................................................................

193

Библиотеки типа в Реестре ...................................................................................................................................

194

РЕАЛИЗАЦИЯ IDISPATCH ................................................................................................................................................

194

Генерация исключений .............................................................................................................................................

196

Маршалинг................................................................................................................................................................

196

ЧТО ВЫ ХОТИТЕ СДЕЛАТЬ СЕГОДНЯ? ............................................................................................................................

197

12 ГЛАВА

 

МНОГОПОТОЧНОСТЬ...............................................................................................................................................

199

ПОТОКОВЫЕ МОДЕЛИ COM...........................................................................................................................................

199

Потоки Win32...........................................................................................................................................................

199

Потоки СОМ ............................................................................................................................................................

200

Подразделение ..........................................................................................................................................................

200

Разделенные потоки ................................................................................................................................................

202

Свободные потоки ...................................................................................................................................................

202

Маршалинг и синхронизация ...................................................................................................................................

203

РЕАЛИЗАЦИЯ МОДЕЛИ РАЗДЕЛЕННЫХ ПОТОКОВ ...........................................................................................................

204

Автоматический маршалинг ..................................................................................................................................

205

 

7

Ручной маршалинг ....................................................................................................................................................

205

Настало время написать программу .....................................................................................................................

206

Пример с разделенным потоком.............................................................................................................................

206

РЕАЛИЗАЦИЯ МОДЕЛИ СВОБОДНЫХ ПОТОКОВ...............................................................................................................

211

Пример со свободным потоком ..............................................................................................................................

212

Оптимизация маршалинга для свободных потоков..............................................................................................

215

ИНФОРМАЦИЯ О ПОТОКОВОЙ МОДЕЛИ В РЕЕСТРЕ ........................................................................................................

216

РЕЗЮМЕ ..........................................................................................................................................................................

217

13 ГЛАВА

 

СЛОЖИМ ВСЕ ВМЕСТЕ.............................................................................................................................................

219

ПРОГРАММА TANGRAM..................................................................................................................................................

220

Tangram в работе.....................................................................................................................................................

220

Детали и составные части.....................................................................................................................................

220

Клиентский EXE-модуль..........................................................................................................................................

221

Компонент TangramModel ......................................................................................................................................

221

Компоненты TangramGdiVisual и TangramGLVisual ............................................................................................

222

Компоненты TangramGdiWorld и TangramGLWorld ............................................................................................

222

ЧТО ДЕМОНСТРИРУЕТ ПРИМЕР .......................................................................................................................................

223

ФАЙЛЫ IDL....................................................................................................................................................................

223

Файл DLLDATA.C .....................................................................................................................................................

224

ЦИКЛИЧЕСКИЙ ПОДСЧЕТ ССЫЛОК .................................................................................................................................

224

Не вызывайте AddRef...............................................................................................................................................

224

Используйте явное удаление....................................................................................................................................

225

Используйте отдельный компонент ......................................................................................................................

225

СОБЫТИЯ И ТОЧКИ ПОДКЛЮЧЕНИЯ................................................................................................................................

226

IEnumXXX..................................................................................................................................................................

227

ОСНОВА COM — СТАНДАРТНЫЕ ИНТЕРФЕЙСЫ............................................................................................................

228

У-У-Ф! ............................................................................................................................................................................

228

Соседние файлы в предмете Программирование на C++