Глава 1. Классическое объектно-ориентированное программирование | 21 |
|
Жизнь без объектов: вспомним структурное программирование на С | 22 |
Программирование с использованием пользовательских типов | 23 |
Заполнение области объявления глобальных идентификаторов | 24 |
Лабораторная работа 1.1. Структурное программирование на С | 25 |
Шаг 1. Подготовка рабочей области проекта | 26 |
Шаг 2. Определение прототипов глобальных функций и структуры CAR | 26 |
Шаг 3. Реализация глобальных функций | 27 |
Шаг 4. Реализация функции main() | 29 |
Проблемы структурного программирования | 30 |
Принципы объектно-ориентированных языков | 32 |
От структур С к классам C++ | 33 |
Создание и разрушение объектов: конструкторы и деструкторы | 35 |
Строим начальный класс CEmployee | 36 |
Принцип инкапсуляции | 37 |
Спецификация инкапсуляции в C++ | 38 |
Методы доступа и методы изменения: безопасное изменение состояния |
объекта | 40 |
Реализация методов класса: оператор расширения области видимости | 41 |
Лабораторная работа 1.2. Хорошо инкапсулированный автомобиль | 42 |
Шаг 1. Подготовка рабочей области проекта и вставка класса CCar | 43 |
Шаг 2. Определение открытого интерфейса CCar | 44 |
Шаг 3. Реализация методов класса CCar | 45 |
Шаг 4. Реализация головного блока | 47 |
Принцип наследования | 48 |
Отношение «А есть В»: классическое наследование | 49 |
Несколько слов о RTTI | 50 |
Производные классы в C++: расширение функциональных возможностей |
базового класса | 50 |
Отношение «А содержит В»: контейнеры и делегирование | 53 |
Принцип полиморфизма | 55 |
Определение виртуальных функций | 55 |
Использование чисто виртуальных функций | 57 |
Иерархия классов на примере Employee | 59 |
Полиморфизм в действии: использование указателей базового класса | 61 |
Таблицы виртуальных функций | 61 |
Ad hoc полиморфизм | 62 |
Visual Basic и ad hoc полиморфизм | 63 |
Лабораторная работа 1.3. Иерархия сотрудников в C++ | 64 |
Шаг 1. Создание рабочего пространства проекта и начальное |
определение классов | 65 |
Шаг 2. Реализация абстрактного базового класса CEmployee | 65 |
Шаг 3. Реализация класса CFTEmployee | 67 |
Шаг 4. Реализация класса CSalesEmployee | 68 |
Шаг 5. Полиморфизм на основе указателей базового класса | 69 |
Программирование на основе шаблонов | 72 |
Шаблоны в качестве контейнеров | 74 |
Краткое содержание главы | 76 |
|
Глава 2. Программирование на основе интерфейсов | 78 |
|
Одиночный открытый сектор | 78 |
Разбиение одиночного открытого интерфейса на отдельные интерфейсы | 79 |
Действия, выражаемые интерфейсом | 81 |
Обозначение классов с множественными интерфейсами на схемах | 81 |
Определение интерфейса в C++ | 82 |
Поддержка интерфейсов в C++ | 84 |
Обеспечение инкапсуляции | 86 |
Обеспечение полиморфности поведения | 88 |
Объявление переменных интерфейса | 89 |
Определение контракта | 90 |
Как удовлетворить клиентов: опубликованные интерфейсы | 91 |
Создание версий опубликованных интерфейсов | 91 |
Неверный способ создания версий интерфейсов | 94 |
Разработка иерархии интерфейсов | 95 |
Разработка API на основе пользовательского интерфейса: API Rect | 97 |
Идентификация интерфейса | 98 |
Использование API 3D Rect: код клиента | 100 |
Лабораторная работа 2.1. Программирование на основе интерфейсов | 102 |
Шаг 1. Подготовка рабочего пространства проекта и разработка |
интерфейса | 102 |
Шаг 2. Реализация класса C3DRect | 10З |
Шаг 3. Разработка начального API Rect | 104 |
Шаг 4. Код стороны клиента | 106 |
Шаг 5. Создание версий существующего интерфейса | 106 |
Шаг 6. Обновление API прямоугольников | 108 |
Шаг 7. Модификация кода клиента | 110 |
Шаг 8. Полиморфизм на основе интерфейсов (или прелесть работы |
с указателями) | 111 |
Краткое содержание главы | 114 |
|
Глава 3. Модель компонентных объектов — COM | 115 |
|
Рабочее определение модели компонентных объектов | 116 |
Преимущества COM | 116 |
Независимость COM от языка программирования | 117 |
«Прозрачность местонахождения» (Location Transparency) | 117 |
Модель COM — объектно-ориентированная | 121 |
Контейнеризация и агрегация в модели COM | 122 |
Обеспечение моделью COM механизма создания версий компонентов | 124 |
Связь COM, OLE и ActiveX | 124 |
OLE 1.0 | 124 |
OLE 2.0 | 124 |
ActiveX | 125 |
Стандартные и пользовательские интерфейсы | 125 |
Идентификаторы интерфейсов (IID) | 127 |
Создание пользовательских GUID | 129 |
IUnknown — базовый интерфейс COM | 132 |
Управление временем жизни объекта COM с использованием функций |
AddRef() и Released | 133 |
Правила вызова функций AddRef() и ReleaseQ | 135 |
Получение указателей интерфейса с помощью метода Querylnierface() | 137 |
Реализация QueryInterface() с помощью static_cast<> | 139 |
Установка «личности» объекта интерфейсом IUnknown | 139 |
HRESULT. стандарт возвращаемого типа модели COM | 140 |
Анализ HRESULT | 142 |
Определение интерфейсов COM с помощью макросов COM | 143 |
Определение интерфейса с помощью стандартных макросов COM | 144 |
Реализация интерфейсов с использованием стандартных макросов COM | 146 |
Строки в модели COM | 148 |
Тип данных OLECHAR | 149 |
Тип данных BSTR | 150 |
Создание новых BSTR в C++ | 151 |
Операции с BSTR | 151 |
Дополнительные функции API для работы с BSTR | 152 |
Преобразование из Unicode в ANSI | 153 |
Функции преобразования | 154 |
Пример текста COM: методы интерфейса, использующие BSTR | 155 |
Просмотр строк Unicode | 158 |
Правила разработки интерфейсов и классов COM в C++ | 159 |
Лабораторная работа 3.1. COM как лучший C++ | 159 |
Шаг 1. Проектирование интерфейса | 160 |
Шаг 2. Реализация IUnknown | 162 |
Шаг 3. Реализация методов пользовательских интерфейсов | 164 |
Шаг 4. Создание функции начальной загрузки | 166 |
Шаг 5. Код стороны клиента | 167 |
Активизация объектов COM | 169 |
Объекты классов COM и интерфейс IClassFactory | 170 |
Построение фабрики класса | 172 |
Реализация метода IClassFactoryr::Createlnstance() | 174 |
Реализация метода IClassFactory::LockServer() | 175 |
Реализация DLL | 176 |
Экспорт серверных объектов класса: DUGetClassObject() и CLSID | 176 |
Управление временем жизни сервера: DllCan UnloadNow() | 178 |
Экспорт функций сервера | 180 |
Менеджер управления сервисом (SCM) и реестр системы | 181 |
Программные идентификаторы (ProgID) | 181 |
Необходимый ключ: HKEY_CLASSES_ROOT CLSID | 183 |
Регистрация COM-сервера | 184 |
Лабораторная работа 3.2. Разработка внутрипроцессного сервера COM |
на C++ | 186 |
Шаг 1. Подготовка рабочего пространства проекта и перенос СоCar | 186 |
Шаг 2. Разработка фабрики класса для CoCar | 188 |
Шаг 3. Реализация хранилища компонентов DLL | 192 |
Шаг 4. Внесение информации в реестр | 193 |
Разработка клиента COM | 194 |
Начальная загрузка COM Runtime | 195 |
Активизация объектов COM | 195 |
Доступ к коклассу с помощью метода СоCreateInstanceQ | 197 |
Отладка внутрипроцессного COM-сервера | 198 |
Лабораторная работа 3.3. Разработка COM-клиента | 199 |
Шаг 1. Подготовка рабочего пространства проекта | 200 |
Шаг 2. Реализация функции main() | 200 |
Краткое содержание главы | 203 |
|
Глава 4. Информация о типе и языковая независимость | 204 |
|
Жизнь без IDL | 205 |
Происхождение MIDL | 207 |
Рабочее определение IDL | 207 |
Что IDL вносит в COM? | 208 |
Конфигурирование проекта Win32 для компиляции IDL | 209 |
Результат работы компилятора MIDL | 210 |
Базовые типы данных IDL | 211 |
Проблемы с основными типами IDL | 212 |
Тип данных variant языка Visual Basic | 213 |
Набор variant-совместимых типов IDL | 214 |
Пример интерфейса, определённого на языке IDL | 215 |
Оператор typedef языка IDL | 216 |
Ключевое слово import языка IDL | 217 |
Определение пользовательских интерфейсов средствами IDL | 218 |
Атрибуты параметров, задающие направление обмена данными | 219 |
Создание перечислений в IDL | 220 |
Автоматическая справка в IDL | 221 |
Определение библиотечных команд в IDL | 222 |
Определение коклассов в IDL | 223 |
Определение интерфейса, задаваемого по умолчанию | 224 |
Физические и логические возвращаемые значения: атрибут [retval] | 225 |
Полный листинг Shapes.idl | 227 |
Файлы, генерируемые компилятором MIDL | 228 |
Использование файлов, сгенерированных компилятором MIDL | 230 |
Сводка основных ключевых слов IDL | 231 |
Регистрация информации о типе: HKEY_CLASSES_ROOTTypeLib | 232 |
Средство просмотра объектов OLE/COM | 234 |
Использование языка Visual Basic в модели COM | 236 |
Создание коклассов в VB | 237 |
Вызов QueryInterface() из Visual Basic | 238 |
Несколько слов об языке Java для COM | 240 |
Включение информации о типе в проекты J++ | 240 |
Сгенерированный код Java | 242 |
Получение @com в Java | 243 |
Создание коклассов и доступ к интерфейсам из Java | 244 |
Использование директив компилятора Visual C++ COM | 245 |
Импортирование информации о типе | 246 |
Что такое специальные указатели | 246 |
Шаблон _com_ptr_t<> | 247 |
Использование специальных указателей в коде COM-клиента | 248 |
Использование нового специального указателя | 248 |
Дополнительные расширения Visual C++ COM | 250 |
Лабораторная работа 4.1. Предоставление информации о типе для СоCar | 251 |
Шаг 1. Создание информации о типе | 251 |
Шаг 2. Регистрация информации о типе | 254 |
Шаг 3. Клиент на Visual Basic | 255 |
Шаг 4. COM-клиент на Java | 258 |
Шаг 5. Клиентское приложение на C++ с использованием библиотеки |
типов | 261 |
Краткое содержание главы | 263 |
|
Глава 5. Информация о типе и прозрачность местонахождения | 264 |
|
Прозрачность местонахождения | 265 |
Прокси-объект | 268 |
Объект канала | 268 |
Менеджер прокси-объектов | 270 |
Заглушка | 271 |
А теперь всё вместе! | 272 |
Создание заглушек и прокси-объектов: интерфейс IPSFactoryBuffer | 273 |
Размещение COM DLL в суррогатном процессе | 274 |
Идентификаторы приложения (AppID) | 275 |
Установка AppID в реестре: HKEY_CLASSES_ROOTAppID | 275 |
Конфигурирование суррогатного процесса с помощью программы OLE/COM |
Object Viewer | 278 |
Программирование суррогатного клиента | 279 |
Маршалинг в модели COM | 280 |
Пользовательский маршалинг | 281 |
Стандартный маршалинг | 282 |
Маршалинг библиотеки типов | 287 |
Конфигурирование интерфейса под использование универсального |
маршалинга | 288 |
Как упростить регистрацию интерфейса и библиотеки типов | 290 |
Построение локального COM-сервера | 291 |
Предоставление фабрик класса из локального сервера | 291 |
Удаление объектов класса из таблицы объектов | 294 |
Регистрация множественных фабрик класса | 294 |
Контрольная точка: GetMessage() | 296 |
Время жизни объектов в ЕХЕ-серверах | 297 |
Регистрация локальных COM-серверов | 298 |
Лабораторная работа 5.1. Разработка локального сервера на C++ | 299 |
Шаг 1. Создание рабочего пространства проекта | 299 |
Шаг 2. Собираем хранилище компонентов для EXE-сервера | 301 |
Шаг 3. Создаём и используем глобальные функции блокировки | 303 |
Шаг 4. Создание клиента для локального сервера | 305 |
Если ((DCOM == COM) && (COM == DCOM)) возвращает S_OK | 306 |
Связь локального SCM и удалённого SCM | 307 |
Что такое DCOMCNFG? | 308 |
Краткий обзор DCOMCNFG | 309 |
Новый ключ: HKEY_LOCAL_MACHINE | 311 |
Основы безопасного доступа в модели COM | 312 |
Установка уровня аутентификации | 313 |
Управление доступом | 314 |
Установка идентификатора сервера | 316 |
Удалённый доступ с помощью DCOMCNFG: конфигурирование машины клиента |
и машины сервера | 316 |
Программные вызовы функций библиотеки DCOM | 318 |
Лабораторная работа 5.2. Доступ к удалённому серверу с |
использованием DCOM | 321 |
Шаг 1. Регистрация сервера на удалённой машине | 321 |
Шаг 2. Безопасность сервера на удалённой машине | 322 |
Шаг 3. Конфигурирование машины клиента | 322 |
Шаг 4. Программный доступ к удалённому серверу | 323 |
Краткое содержание главы | 326 |
|
Глава 6. Введение в библиотеку активных шаблонов (ATL) | 327 |
|
Необходимость ATL | 327 |
Что такое ATL? | 329 |
Разделение труда: ATL и вы | 331 |
Создание хранилища компонентов с помощью ATL COM AppWizard | 331 |
Задание типа сервера | 333 |
Вставка кода заглушки/прокси-объекта | 333 |
Поддержка MFC | 336 |
Поддержка сервера транзакций Microsoft (MTS) | 337 |
Подтверждение введённой информации | 338 |
Стартовые файлы проекта ATL DLL | 338 |
Стартовые ресурсы проекта | 339 |
Прекомпилированные заголовочные файлы | 340 |
Каркас IDL-файла | 341 |
Файл хранилища компонентов: ATLShapesServer.cpp | 341 |
Регистрация саморегистрирующихся серверов | 344 |
Мастер ATL Object Wizard | 345 |
Категория объектов | 346 |
Категория элементов управления | 347 |
Остальные типы категорий, предоставляемые Object Wizard | 349 |
Вставка простого объекта | 349 |
Удаление кокласса ATL | 351 |
Изменения в файлах проекта | 352 |
Новые файлы проекта | 353 |
Файл CCoHexagon.h | 354 |
Класс CComObjectRootEx<> | 355 |
ATL COM-карта | 355 |
Класс CComCoClass<> | 356 |
Файл CCoHexagon.cpp | 356 |
Файл CoHexagon.rgs | 356 |
Язык скриптов реестра в ATL | 357 |
Вставка методов в интерфейсы | 359 |
Добавление интерфейсов | 362 |
Добавление (или удаление) интерфейса вручную | 362 |
Использование мастера Implement Interface Wizard | 365 |
Назначение свойств интерфейсам | 368 |
IDL-синтаксис для свойств интерфейса | 370 |
Свойства с точки зрения клиента | 371 |
ATL и COM-текст | 372 |
CComBSTR: изящная упаковка BSTR | 373 |
Макросы преобразования строк библиотеки ATL | 376 |
Отладка проектов ATL | 378 |
Лабораторная работа 6.1. Сервер Car с использованием ATL | 381 |
Шаг 1. Разработка хранилища компонентов и проверка кода | 381 |
Шаг 2. Вставка простого объекта | 382 |
Шаг 3. Реализация интерфейса ICreateCar | 384 |
Шаг 4. Добавление интерфейса вручную | 385 |
Шаг 5. Использование мастера Implement Interface Wizard | 388 |
Шаг 6. Интерфейс со свойствами | 389 |
Краткое содержание главы | 391 |
|
Глава 7. Объекты ATL COM и COM-исключения | 392 |
|
На случай, если вы не знаете | 392 |
Потоки в Win32 | 394 |
Проблема конкурирования и синхронизация потоков | 395 |
Потоки и COM | 397 |
Апартаменты в модели COM | 397 |
Однопотоковый апартамент (STA) | 398 |
Многопотоковый апартамент (МТА) | 399 |
Выбор модели апартамента | 400 |
Задание потоковой модели для ЕХЕ-сервера | 401 |
Задание потоковой модели для DLL-сервера | 402 |
Ещё раз о маршалинге | 404 |
Задание потоковой модели для объекта в ATL | 405 |
Базовые потоковые классы ATL | 407 |
Поддержка объектов STA в библиотеке ATL | 407 |
Поддержка ATL объектов в МТА | 410 |
Поддержка модели потока ATL-сервера, устанавливаемой по умолчанию | 412 |
Коклассы ATL как абстрактные базовые классы | 413 |
Шаблоны CComObject<> | 413 |
Простой объект ATL | 415 |
Признак объявления класса ATL_NO_VTABLE | 417 |
Методы FinalConstruct() и FinalRelease() | 418 |
Класс CComObjectRootBase: вспомогательные методы IUnknown | 419 |
CComObjectRootBase: поддержка агрегации | 420 |
CComObjectRootBase: вспомогательные функции макросов COM-карты | 421 |
CComObjectRootEx<>: задание потоковой модели | 423 |
CComCoClass<>: фабрики класса, агрегация и обработка ошибок | 424 |
CComObject<>: использование | 425 |
Метод CComObject::CreateInstance() | 427 |
COM-карта в библиотеке ATL | 428 |
Макрос BEGIN_COM_MAP | 429 |
Массив структур _ATL_INTMAP_ENTRУ | 431 |
Вспомогательный метод _GetEntries() | 431 |
Метод _InternalQueryInterface() | 432 |
Метод _GetRawUnknown() | 432 |
Макрос END_COM_MAP | 433 |
Макрос COM_INTERFACE_ENTRY: внесение интерфейсов в COM-карту | 434 |
AtlInternalQueryInterface(): гуляем по COM-карте | 436 |
Обработка ошибок | 437 |
Стандартные интерфейсы ошибок и библиотечные функции COM | 439 |
Конфигурирование кокласса на C++ для поддержки COM-исключений | 440 |
Инициализация COM-исключения | 442 |
Клиент на C++: перехват COM-исключения | 443 |
Клиент на Visual Basic Client: перехват COM-исключения | 445 |
Поддержка ISupportErrorlnfo в ATL | 447 |
Поддержка возбуждения COM-исключений в ATL | 449 |
Лабораторная работа 7.1. Отправка и получение COM-исключений | 451 |
Шаг 1. Поддержка ISupportErrorlnfo | 451 |
Шаг 2. Инициализация COM-исключения | 452 |
Шаг 3. Клиент на C++ | 454 |
Шаг 4. Клиент на VB | 456 |
Краткое содержание главы | 457 |
|
Глава 8. Идентификация COM-объектов и библиотека активных шаблонов | 458 |
|
Базовая COM-карта в ATL | 458 |
Варианты макросов COM-карты в библиотеке ATL | 459 |
Реализация C++ кокласса с использованием множественного наследования | 461 |
Реализация объекта COM с использованием вложенных классов | 462 |
Определение внутреннего класса | 464 |
Реализация внутреннего класса | 465 |
Реализация внешнего Querylnterface() | 466 |
Использование вложенного класса | 467 |
Лабораторная работа 8.1. Проектирование кокласра с вложенными классами | 468 |
Шаг 1. Разработка начального проекта и кода на IDL | 468 |
Шаг 2. Реализация CoHexagon с использованием вложенных классов | 469 |
Шаг 3. Создание фабрики класса | 473 |
Шаг 4. Сборка хранилища компонентов | 474 |
Шаг 5. Клиент на Visual Basic | 475 |
Разрешение конфликтов имён методов интерфейса | 476 |
Разрешение конфликта имён в ATL | 480 |
Лабораторная работа 8.2. Предотвращение конфликта имён в ATL | 483 |
Шаг 1. Создание конфликта имён | 483 |
Шаг 2. Разрешение конфликта имён | 485 |
Неоднозначности в иерархии интерфейсов | 487 |
Макрос COM_INTERFACE_ENTRY_IID | 490 |
Макрос COM_INTERFACE_ENTRY2 | 491 |
Макрос COM_INTERFACE_ENTRY2_IID | 491 |
Отрываемые интерфейсы | 492 |
Пример отрываемого интерфейса на C++ | 493 |
Реализация отрываемого интерфейса | 495 |
Изменения в классе-владельце | 497 |
Использование отрываемого интерфейса | 499 |
Создание отрываемого интерфейса средствами ATL | 500 |
Реализация в ATL класса-владельца | 501 |
Макрос COM_INTERFACE_ENTRY_CACHED_TEAR_OFF | 502 |
Задание интерфейса IUnknown класса-владельца | 503 |
Вам понравились отрываемые интерфейсы? | 505 |
Лабораторная работа 8.3. Создание отрываемого интерфейса средствами |
ATL | 506 |
Шаг 1. Добавляем к CoCar новый интерфейс | 506 |
Шаг 2. Создание «отрываемого» класса | 508 |
Шаг 3. Модификация класса-владельца | 510 |
Шаг 4. Клиент для тестирования небуферизованного отрываемого |
интерфейса | 511 |
Шаг 5. Буферизованный отрываемый интерфейс | 513 |
Механизмы повторного использования в COM: контейнеризация и |
агрегация | 513 |
Контейнеры и делегирование в C++ | 513 |
Контейнеры и делегирование в COM | 515 |
Пример контейнеризации и делегирования | 517 |
Использование контейнеризованных объектов | 518 |
Лабораторная работа 8.4. Контейнеризация в COM | 519 |
Шаг 1. Создание начального кокласса-контейнера | 519 |
Шаг 2. Создание внутреннего (контейнеризованного) кокласса | 520 |
Шаг 3. Делегирование вызовов внутреннему объекту | 521 |
Шаг 4. Модификация IDL-файла | 523 |
Агрегация в модели COM | 524 |
Поддержка агрегации в ATL | 526 |
Конфигурирование внешнего объекта | 527 |
Макросы COM-карты, поддерживающие агрегацию | 529 |
Макросы COM-карты для автоагрегации | 530 |
Лабораторная работа 8.5. Агрегация средствами ATL | 532 |
Шаг 1. Создание агрегированного объекта | 532 |
Шаг 2. Экспонируем интерфейсы внутреннего объекта | 533 |
Шаг 3. Модификация IDL-файла | 534 |
Шаг 4. «Слепая» автоагрегация | 535 |
Шаг 5. Модификация CoMiniVan | 537 |
Шаг 6. Модификация клиента на VB | 538 |
Заключительные макросы COM-карты | 539 |
Запуск пользовательских функций при вызове интерфейса | 540 |
Последний макрос: COM_INTERFACE_ENTRY_CHAIN | 542 |
Краткое содержание главы | 543 |
|
Глава 9. Хранилища компонентов и библиотека активных шаблонов | 544 |
|
Задачи, выполняемые сервером COM | 544 |
Класс CComModule: диспетчер-контролер вашего сервера | 545 |
Создание и удаление объектов CComModule | 546 |
Отслеживание активных блокировок и активных объектов | 547 |
Поддержка регистрации | 548 |
Создание фабрик класса | 548 |
Экземпляр CComModule, генерируемый по умолчанию | 549 |
Что такое карта объектов | 549 |
Построение карты объектов | 550 |
Структура _ATL_OBJMAP__ENTRY | 551 |
Макрос OBJECT_ENTRY | 553 |
Определение метода Update Registry() | 555 |
Пользовательские версии UpdateRegistry() | 558 |
Когда вызывается UpdateRegistry() | 559 |
Классы-создатели в ATL | 560 |
Задание метода _ClassFactoryCreatorClass::CreateInstance() | 561 |
CComClassFactory: реализация IClassFactory по умолчанию | 565 |
Лицензионные фабрики класса и IClassFactory2 | 568 |
Фабрики класса для объекта-одиночки | 569 |
Ваша собственная фабрика класса | 571 |
Задание метода _CreatorClass::CreateInstance() | 572 |
Альтернативные макросы агрегации | 574 |
Задание метода GetObjectDescription() | 576 |
Категории COM | 578 |
Обзор категорий компонентов | 579 |
Классификация категорий COM | 580 |
Задание метода GetCategoryMap() | 581 |
Задание пользовательской карты категорий | 582 |
Задание метода ObjectMain() | 585 |
Построение моделей объектов сервера | 585 |
Макрос OBJECT_ENTRY_NON_CREATEABLE: задание «несоздаваемых» |
коклассов | 587 |
Краткая справка по карте объектов | 588 |
Лабораторная работа 9.1. Полнофункциональный сервер ATL | 588 |
Шаг 1. Создание начального сервера | 589 |
Шаг 2. Создание пользовательской категории COM | 591 |
Шаг 3. Специальная регистрация | 593 |
Шаг 4. Несоздаваемый класс | 595 |
Шаг 5. Обеспечение доступа к несоздаваемому классу | 596 |
Шаг 6. Тестовая программа-клиент на Visual Basic | 598 |
Шаг 7. Получение категорий COM | 599 |
Краткое содержание главы | 601 |
|
Глава 10. Скриптовые объекты и ATL | 602 |
|
«Интеллектуальные» клиенты и vTable-интерфейс | 603 |
«Глупые» клиенты: языки, не понимающие vTable | 604 |
Кому требуется IDispatch? | 605 |
Интерфейс IDispatch | 607 |
Методы интерфейса IDispatch | 608 |
Интерфейс диспетчеризации и константы DISPID | 609 |
Способы реализации интерфейса диспетчеризации средствами C++ | 613 |
Реализация IDispatch средствами C++ | 614 |
Код стороны клиента и тип данных variant | 619 |
Создание типа данных variant в C++ | 621 |
CComVariant упаковочный класс ATL для типа данных variant | 623 |
Структура DISPPARAMS | 623 |
Безопасные массивы | 627 |
Библиотечные функции COM для работы со структурой SAFEARRAY | 628 |
Использование структур SAFEARRAY в качестве параметров | 629 |
Лабораторная работа 10.1. Создание скриптового объекта средствами C++ | 632 |
Шаг 1. Создание начального сервера и кокласса | 632 |
Шаг 2. Фабрика класса и хранилище компонентов | 636 |
Шаг 3. Клиент C++, использующий позднее связывание | 637 |
Шаг 4. Клиент на Visual Basic, использующий позднее связывание | 638 |
Шаг 5. Скриптовый клиент, использующий позднее связывание | 638 |
Шаг 6. Запуск CoSquiggle из MS Visual Studio | 640 |
Дуальные интерфейсы | 641 |
Разработка дуальных интерфейсов средствами IDL и C++ | 642 |
Создание кокласса дуального интерфейса вручную | 643 |
Лабораторная работа 10.2. Разработка объекта, поддерживающего |
дуальные интерфейсы | 645 |
Шаг 1. Добавление информации о типе | 646 |
Шаг 2. Модификация CoSquiggle | 647 |
Шаг 3. Клиент VB | 649 |
Шаг 4. Клиент MFC | 650 |
Создание интерфейса диспетчеризации с использованием информации |
о типе | 653 |
Лабораторная работа 10.3. Дуальный объект, реализованный с |
использованием информации о типе | 657 |
Шаг 1. Загрузка информации о типе | 658 |
Шаг 2. Применение информации о типе | 659 |
Шаг 3. Снова используем информацию о типе | 661 |
Создание интерфейса диспетчеризации средствами ATL | 662 |
Шаблон IDispatchlmpl<> | 663 |
Упаковочный класс ATL для информации о типе: CComTypelnfoHolder | 665 |
Несколько дуальных интерфейсов в одном коклассе | 667 |
Лабораторная работа 10.4. Поддержка интерфейса IDispatch в ATL | 669 |
Шаг 1. Модификация существующего кода IDL | 670 |
Шаг 2. Модификация кокласса | 671 |
Шаг 3. Создание Web-клиента | 672 |
Краткое содержание главы | 675 |
|
Глава 11. Перечисления и коллекции в COM | 676 |
|
Описание сложных параметров интерфейсов в IDL | 676 |
Задание массивов IDL в качестве параметров методов | 677 |
Безопасные массивы в качестве параметров методов | 679 |
Структуры в качестве параметров методов | 682 |
COM-интерфейс в качестве параметра метода | 684 |
Перечисления в COM | 685 |
Стандартные интерфейсы перечислений | 686 |
Методы интерфейсов перечислений COM | 687 |
Создание пользовательского COM-интерфейса перечислений средствами C++ | 689 |
Реализация интерфейса IEnumAge | 691 |
Использование COM-объекта перечисления | 693 |
Поддержка ATL перечислений COM | 695 |
Шаблон CComlEnum<> | 695 |
Шаблон CComEnumlmpl<> | 696 |
Шаблон CComEnum<> | 697 |
Шаблоны ATL__Сору<> | 698 |
Создание интерфейсов перечислений средствами ATL | 699 |
Флаги инициализации перечисления | 702 |
Код стороны клиента | 703 |
Лабораторная работа 11.1. Создание объекта перечисления ATL | 704 |
Шаг 1. Задание связи контейнер/внутренний объект | 704 |
Шаг 2. Определение пользовательского COM-интерфейса перечисления | 707 |
Шаг 3. Реализация метода GetPersonEnum() | 707 |
Шаг 4. Клиент C++ | 708 |
Коллекции в COM | 709 |
Стандартные методы коллекций COM | 710 |
Разработка простой коллекции COM | 711 |
Реализация метода Count() | 713 |
Реализация метода Item() | 714 |
Выполнение методов Count() и Item() в Visual Basic | 715 |
Реализация метода _NewEnum | 716 |
Добавление и удаление объектов | 718 |
Лабораторная работа 11.2. Создание коллекции средствами ATL | 722 |
Шаг 1. Создание внутреннего объекта | 722 |
Шаг 2. Создание интерфейса коллекции | 723 |
Шаг 3. Реализация начального объекта коллекции | 723 |
Шаг 4. Добавление и удаление элементов | 726 |
Шаг 5. Клиент на Visual Basic | 727 |
Краткое содержание главы | 729 |
|
Глава 12. Косвенно-вызываемые интерфейсы и соединяемые объекты | 731 |
|
Односторонний обмен информацией | 731 |
Опрос объекта | 733 |
Механизм косвенного вызова | 733 |
Разработка механизма косвенного вызова в C++ | 734 |
Использование косвенно-вызываемого интерфейса из Visual Basic | 738 |
Использование косвенного вызова в C++ | 739 |
Лабораторная работа 12.1. Создание косвенно-вызываемого интерфейса | 740 |
Шаг 1. Генерация кода IDL | 741 |
Шаг 2. Конфигурирование CoCar | 742 |
Шаг 3. Клиент на Visual Basic | 743 |
Шаг 4. Клиент на C++ | 745 |
Архитектура соединяемых объектов COM | 747 |
Интерфейсы IConnectionPointContainer и IEnum ConnectionPoints | 748 |
Интерфейсы IConnectionPoint и IEnumConnections | 750 |
Создание соединяемого объекта в C++ | 752 |
Уведомление и отмена уведомления | 754 |
Остальные методы, реализуемые объектом-источником | 755 |
Возбуждение события | 757 |
Реализация контейнера точек соединения в C++ | 757 |
IDL и внешние интерфейсы | 759 |
Использование соединяемых объектов из Visual Basic | 760 |
Использование соединяемых объектов из C++ | 761 |
Создание соединяемых объектов средствами ATL | 762 |
Установление соединения: ещё один мастер ATL | 766 |
Изменения в коклассе CoSomeObject | 768 |
Подробности о поддержке точек соединения в ATL | 769 |
Шаблон ATL IConnectionPointlmpl<> | 772 |
Интерфейс IProvideClassInfo(2): облегчение жизни клиента | 774 |
Лабораторная работа 12.2. Создание соединяемого объекта средствами |
ATL | 777 |
Шаг 1. Создание начального кокласса | 777 |
Шаг 2. Добавление события | 777 |
Шаг 3. Возбуждение события | 778 |
Шаг 4. Тестовый клиент на VB | 779 |
Краткое содержание главы | 781 |
|
Глава 13. Использование ATL при разработке приложений Windows | 783 |
|
ATL как набор средств для создания окон | 784 |
Составные части окна в Windows | 785 |
Формирование цикла обработки сообщений Windows | 785 |
Создание структуры WNDCLASSEX | 786 |
Отображение окна | 788 |
Обработка сообщений: процедура WndProc | 789 |
ATL и Windows | 791 |
Класс CWindow | 792 |
Создание окна средствами ATL | 795 |
Использование шаблона CWinTraits<> | 795 |
Создание и удаление окна средствами ATL | 797 |
Обработка сообщений Windows средствами ATL | 797 |
Мастер Add Windows Handler Wizard | 798 |
Шаблон CWindowImpl<> | 801 |
Модификация полей структуры WNDCLASSEX, установленных по умолчанию | 803 |
Реализация функции WndProc в ATL | 803 |
Класс CMessageMap и метод Process WindowMessage() | 805 |
Карта сообщений в ATL | 806 |
Заполнение карты сообщений | 807 |
Альтернативные макросы карты сообщений | 808 |
Создание блока диалога в ATL | 809 |
Использование шаблона CSimpleDialog<> | 810 |
Шаблон CSimpleDialog<> | 811 |
Создание интерактивного диалога средствами ATL | 812 |
Добавление пользовательского обработчика события | 814 |
Лабораторная работа 13.1. ATL и Windows | 816 |
Шаг 1. Создание исходного проекта | 816 |
Шаг 2. Создание ресурсов | 817 |
Шаг 3. Создание класса, производного от CWindowImpl<> | 818 |
Шаг 4. Создание объекта COM | 822 |
Шаг 5. Тестовый клиент на Visual Basic | 824 |
Краткое содержание главы | 826 |
|
Глава 14. Разработка элементов управления ActiveX с помощью ATL | 828 |
|
Элемент управления ActiveX | 829 |
Страницы свойств | 830 |
Элементы управления, невидимые во время выполнения программы | 831 |
Структура стандартного элемента управления ActiveX | 832 |
Типы объектов, предоставляемых мастером ATL Object Wizard | 834 |
Конфигурирование полного элемента управления с помощью мастера ATL |
Object Wizard | 836 |
Опции вкладки Miscellaneous | 837 |
Выбор базовых свойств | 839 |
Полный элемент управления: начальный код IDL | 841 |
Модифицированный файл скрипта реестра (RGS) | 842 |
Цепочка наследования для полнофункционального элемента управления | 844 |
Карты, сгенерированные мастером ATL | 846 |
Полнофункциональный элемент управления и категории COM | 848 |
Добавление специального свойства к классу CShapesControl | 849 |
Отображение элемента управления с помощью OnDraw() | 851 |
Пользовательская версия метода OnDraw() | 853 |
Реализация базовых свойств Caption и Font | 855 |
Установка цвета фона | 856 |
Инициализация специального события | 858 |
Задание постоянства свойств | 860 |
Добавление метода AboutBox к элементу управления Shapes Control | 861 |
Тестовый клиент на VB | 862 |
Отладка элементов управления ActiveX | 863 |
Лабораторная работа 14.1. Создание полнофункционального элемента |
управления ActiveX средствами ATL | 864 |
Шаг 1. Подготовка рабочего пространства и ресурсов | 864 |
Шаг 2. Проектирование пользовательского интерфейса | 867 |
Шаг 3. Реализация пользовательских свойств | 869 |
Шаг 4. Реализация методов CreateCar() и AboutBox() | 869 |
Шаг 5. Сборка [default, source]-интерфейса | 870 |
Шаг 6. Добавление переменных для управления анимацией | 871 |
Шаг 7. Конфигурирование таймера | 873 |
Шаг 8. Рисуем изображения | 875 |
Шаг 9. Visual Basic как контейнер | 876 |
Поддержка ActiveX в ATL: шаблоны CComControl<> и IPropertyNotifySinkСР<> | 878 |
Поддержка свойств [bindable] и [requestedit] | 880 |
Поддержка ActiveX в ATL: CComControlBase | 882 |
Свойства окружающей среды | 883 |
Реакция на изменение свойств окружения | 886 |
Базовые свойства и шаблон CStockPropImpl<> в ATL | 886 |
Макросы базовых свойств в ATL | 888 |
Шаблон IViewObjectExImpl<> | 890 |
Постоянство объектов COM и библиотека ATL | 891 |
Макросы карты свойств в ATL | 893 |
Элементы управления ActiveX, страницы свойств и контейнер | 895 |
Создание страниц свойств в ATL | 898 |
Шаблон IPropertyPagelmpl<> | 900 |
Программирование метода Apply() | 901 |
Шаг в другом направлении: отображение текущих свойств в элементах GUI | 905 |
Использование элемента управления ActiveX на Web-странице | 906 |
Манипулирование элемента управления ShapesControl в Web | 907 |
Лицензионная фабрика класса и интерфейс IClassFactory2 | 909 |
Лабораторная работа 14.2. Добавление в проект страниц свойств |
и постоянства свойств | 912 |
Шаг 1. Расширим наши специальные свойства | 912 |
Шаг 2. Поддержка постоянства свойств | 914 |
Шаг 3. Создание страницы пользовательских свойств | 915 |
Краткое содержание главы | 920 |
|
Приложение. Описание дискеты | 921 |
|
Предметный указатель | 922 |