Essential COM - page 2

Дональд Бокс. Сущность технологии СОМ. Библиотека программиста

Перевела с английского А. Шкадова

Главный редактор В. Усманов
Заведующий редакцией Е. Строганова
Руководитель проекта А. Васильев
Научный редактор А. Артемьев
Литературные редакторы Е. Ваулина, А. Петроградская
Обложка Н. Биржаков
Корректор С. Беляева
Верстка А. Зайцев

ББК 32.973.2-018

УДК 681.3.06

Бокс Д.

Б78 Сущность технологии СОМ. Библиотека программиста. — СПб.: Питер, 2001. — 400 с.: ил.

ISBN 5-318-00058-4

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Original English language Edition Copyright © 1998 by Addison Wesley Longman, Inc.
© Перевод на русский язык, А. Шкадова, 2001
© Издательский дом «Питер», 2001

Права на издание получены по соглашению с Addison Wesley Longman, Inc.

Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.:)

Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственность за возможные ошибки, связанные с использованием книги.

ISBN 5-318-00058-4 ISBN
0-201-63446-5 (англ.)

ЗАО «Питер Бук». 196105, Санкт-Петербург, ул. Благодатная, 67.
Лицензия ИД № 01940 от 05.06.00.
Налоговая льгота - общероссийский классификатор продукции ОК 005-93, том 2; 953000 - книги и брошюры. Подписано в печать 27.03.01. Формат 70х 100 1/16. Усл. п. л. 32,25. Тираж 5000 экз. Заказ № 361. Отпечатано с готовых диапозитивов в ФГУП «Печатный двор» им. А. М. Горького Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 197110, Санкт-Петербург, Чхаловский пр., 15.

Краткое содержание

Предисловие Чарли Киндела
Предисловие Грэйди Буча
От автора
Благодарности

Глава 1. СОМ как улучшенный C++.
Глава 2. Интерфейсы
Глава 3. Классы
Глава 4. Объекты
Глава 5. Апартаменты
Глава 6. Приложения
Глава 7. Разное
Приложение А. Эволюция объектов.
Приложение Б. Избранный код
Алфавитный указатель

Содержание

Предисловие Чарли Киндела

Практичность
Простота ведет к податливости (malleability)
Фольклор

Предисловие Грэйди Буча

От автора

Благодарности

Глава 1. СОМ как улучшенный C++.
Распространение программного обеспечения и язык C++
Динамическая компоновка и C++
C++ и мобильность
Инкапсуляция и C++
Отделение интерфейса от реализации
Абстрактные базы как двоичные интерфейсы
Полиморфизм на этапе выполнения
Расширяемость объекта
Управление ресурсами
Где мы находимся?

Глава 2. Интерфейсы

Снова об интерфейсах и реализациях
IDL
Методы и их результаты
Интерфейсы и IDL
Интерфейс Unknown
Управление ресурсами и IUnknown
Приведение типов и IUnknown
Реализация IUnknown
Использование указателей интерфейса СОМ
Оптимизация QueryInterface
Типы данных
Атрибуты и свойства
Исключения
Где мы находимся?

Глава 3. Классы

Снова об интерфейсе и реализации
Объекты классов
Активация
Использование SCM
Классы и серверы
Обобщения
Оптимизации
Снова интерфейс и реализация
Моникеры и композиция
Моникеры и сохраняемость
Время жизни сервера
Классы и IDL
Эмуляция классов
Категории компонентов
Где мы находимся?

Глава 4. Объекты

Снова Unknown
QueryInterface симметрична
QueryInterface транзитивна
QueryInterface рефлективна
Объекты имеют статический тип
Единственность и идентификация
QueryInterface и IUnknown
Множественные интерфейсы и имена методов
Динамическая композиция
Двоичная композиция
Включение
Где мы находимся?

Глава 5. Апартаменты

Снова интерфейс и реализация
Объекты, интерфейсы и апартаменты
Межапартаментный доступ
Вспомогательные средства для внутрипроцессного маршалинга
Архитектура стандартного маршалинга
Реализация интерфейсных маршалеров
Стандартный маршалинг, потоки и протоколы
Управление жизненным циклом и маршалинг
Специальный маршалинг
Маршалер свободной поточной обработки (FreeThreaded Marshaler)
Где мы находимся?

Глава 6. Приложения

Подводные камни внутрипроцессной активации
Активация и SCM
Снова о времени жизни сервера
Идентификаторы приложений
СОМ и защита
Программируемая защита
Контроль доступа
Управление маркерами
Где мы находимся?

Глава 7. Разное

Основы указателей
Указатели и память
Массивы
Управление потоками данных
Динамический вызов в сравнении со статическим
Двунаправленные интерфейсные контракты
Совмещение имен в IDL
Асинхронные методы
Где мы находимся?

Приложение А. Эволюция объектов.

Приложение Б. Избранный код

СОМ Chat — программа диалогового взаимодействия на базе СОМ
comchat.idl
client.cpp
chatsession.h
chatsession.cpp
svc.cpp

Алфавитный указатель

Посвящается Юдит С., которая помогла мне одолеть одну вещь, более устрашающую, чем СОМ, и сделала возможной написание этой книги, и Барбаре, которая оставалась со мной достаточно долго для того, чтобы увидеть, чем все это кончилось.


Предисловие

Когда я сел писать это предисловие, мне не давали покоя следующие мысли:

  • Будет ли портрет Дона на четвертой стороне обложки, и если да, то какой длины будут его волосы?
  • Осознают ли читатели этой книги, что у Дона есть индивидуализированные (personalized) лицензионные платы, способные читать интерфейс «IUNKNOWN»?
  • Что за чертовщину нужно писать в предисловии к книге?
  • У меня было две идеи насчет того, что написать в этом предисловии. Первая — высказать несколько мыслей о конструировании СОМ, которые я уже давно собираюсь записать. Вторая идея — польстить Дону Боксу в той же мере, в какой он польстил мне обращением с просьбой написать предисловие к своей книге. В конце концов я решил осуществить обе идеи.

    Что есть СОМ? Зачем его придумали? Дон кратко осветил эти вопросы в первой главе. Вводная часть заканчивается словами «...в этой главе показана архитектура для повторного использования модулей, которая позволяет динамично и эффективно строить системы из независимо сконструированных двоичных компонентов». Остальная часть этой главы ведет вас шаг за шагом сквозь мыслительный процесс, происходивший в умах разработчиков СОМ с 1988 по 1993 годы, когда была выпущена первая версия СОМ.

    Я думаю, что существует несколько аспектов конструирования СОМ, которые обеспечили его длительный успех. Первое и основное — это практичность, второе — простота, из которой проистекает его гибкость, или податливость.

    Практичность

    СОМ относится к разработке программного обеспечения весьма прагматично. Вместо того чтобы искать решение на основе почти религиозной академической догмы объектно-ориентированного программирования, СОМ-конструирование принимает во внимание как человеческую природу, так и капитализм. Команда разработчиков выделила лучшие, наиболее коммерчески убедительные аспекты классического объектного ориентирования (00) и объединила их с тем, чему она научилась при попытках добиться повторного использования предыдущих программных разработок — как внутри, так и вне Microsoft.

    Большинство классических текстов, посвященных 00, описывают систему или язык как ориентированный объект, если он поддерживает инкапсуляцию (сокрытие информации), полиморфизм и наследование. Часто подчеркивается, что главной движущей силой повторного использования является наследование. Разработчики СОМ не согласились с таким акцентом. Они поняли, что это слишком упрощенное представление и что в действительности существуют два вида наследования. Наследование реализации предполагает, что наследуется фактическая реализация (поведение). Наследование интерфейсов предполагает, что наследуется только определение (спецификация) поведения. Именно второй вид наследования обеспечивает полиморфизм, и этот вид полностью поддерживается моделью СОМ. С другой стороны, наследование реализации — это просто один из механизмов для повторного использования существующей реализации. Тем не менее, если конечной целью является повторное использование, тогда наследование реализации является просто средством для достижения этой цели, но не является самоцелью.

    Как в исследовательских, так и в коммерческих кругах разработчиков программного обеспечения считалось общепринятым, что наследование реализации — полезный и мощный инструмент, хотя он может привести к чрезмерной связи между базовым и производным классами. Поскольку наследование реализации часто вызывает «утечку» некоторых элементов реализации базового класса, нарушая инкапсуляцию этого класса, разработчики СОМ понимали, что наследование реализации должно быть ограничено программированием внутри компонентов. Поэтому СОМ не поддерживает наследование реализации между компонентами, но поддерживает ее внутри компонентов. Наследование же интерфейсов СОМ поддерживает полностью (по сути, она полагается на это).

    Разработчики СОМ развенчали миф о том, что главную роль при достижении повторного использования играет наследование. Фундаментальное понятие, использующееся в СОМ при моделировании повторного использования, — это инкапсуляция, а не наследование. А принцип наследования СОМ использует при моделировании взаимоотношения типов между объектами, выполняющими сходные функции. Построением СОМ-модели повторного использования на основе инкапсуляции разработчики поддерживали повторное использование в форме черного ящика, устраивающее ожидаемый рынок компонентов. Идея состоит в том, что клиенты должны иметь дело с объектами как с непрозрачными компонентами в смысле того, что находится у них внутри и как они реализованы. Разработчики СОМ полагали, что для проведения этой идеи в жизнь должна быть разработана архитектура. С какой стати любой может разрабатывать систему с другой моделью для повторного использования? Хороший вопрос. Дело, однако, в том, что мир полон «объектно-ориентированных» систем, которые не только не поддерживают инкапсуляцию в стиле черного ящика, но даже затрудняют ее достижение. Классическим примером этого является C++. В первой главе своей книги Дон очень понятно объясняет то, что я подразумеваю под этим.

    Следующие уравнения иллюстрируют различия между объектно-ориентированным и компонентно-ориентированным программированием.

    Объектно-ориентированное программирование = полиморфизм + (немного) позднее связывание + (немного) инкапсуляции + наследование.

    Компонентно-ориентированное программирование = полиморфизм + (истинно) позднее связывание + (действительная, принудительная) инкапсуляция + наследование интерфейсов + двоичное повторное использование.

    Во всяком случае для меня эта дискуссия — род забавы. Борцы за чистоту OO, проживающие в comp.object и comp.object.corba, выбились из сил, тыча пальцами в СОМ и говоря: «Но он не по-настоящему объектно-ориентированный». Вы можете оспорить это двумя способами:

  • 1. «Он-то как раз по-настоящему! Это ваше определение 00 неправильное».

  • 2. «Ну и что!?! СОМ имеет феноменальный коммерческий успех и позволяет тысячам независимых разработчиков создавать потрясающее программное обеспечение, которое интерполирует и интегрирует. И они делают деньги. Много денег1. Программные компоненты, написанные ими, покупаются, используются и повторно используются. Разве не в этом смысл любой технологии? Кроме того, я всегда могу доказать, что только СОМ является истинно компонентно-ориентированным2.
  • Вот так-то!

    Простота ведет к податливости (malleability)

    mal-le-a-ble (mal'e-e-bel) adjective (прилагательное)

  • 1. Способный быть выкованным или сформированным, как под ударами молота или под давлением: податливый металл.
  • 2. Легко контролируемый или поддающийся влиянию; послушный.
  • 3. Способный подстраиваться под изменяющиеся обстоятельства, легко приспосабливаемый: гибкий ум прагматика3.
  • Первое реальное применение СОМ заключалось в том, что он был взят за основу при второй попытке фирмы Microsoft создать сложную структуру документов Object Linking & Embedding 2.0 (связывание и внедрение объектов, OLE 2.0). Если вы рассмотрите всю массу возможностей для приложения СОМ в настоящее время, то сразу поймете, что я имею в виду, называя его податливым. Программисты используют СОМ для обеспечения сменной (plug-in) архитектуры для своих приложений; для конструирования крупномасштабных многоярусных клиент/серверных приложений; для ведения дел и заключения сделок в мире бизнеса; для создания развлекательных сюжетов на Web-страницах; для контроля и мониторинга производственных процессов и даже для выслеживания спутников-шпионов путем дистанционного управления целой армией телескопов.

    Эта податливость достигнута благодаря тому, что разработчики СОМ поставили во главу угла принцип: ядро модели будет настолько простым, насколько это необходимо, но не более. Одной из наиболее явных сторон этого подхода является нудность программирования на СОМ на сегодняшний день. Программисты, работающие на С или C++, должны возиться со всей этой ерундой, в том числе с GUID и со счетчиками ссылок. Можно было бы добавить к СОМ всякого рода усовершенствования с целью упрощения работы с ней. Но разработчики вместо этого акцентировали внимание на том, чтобы заставить модель работать. Они считали, что если они достигнут успеха, то сервисную поддержку можно будет обеспечить позднее. И это предположение было подтверждено недавними выпусками простых в употреблении инструментов СОМ, таких как Visual Basic, поддержка СОМ в Visual C++ 5.0, а также Active Template Library. К тому времени, когда вы читаете этот текст, фирма Microsoft должна уже объявить о своих будущих планах радикально упростить разработку СОМ с помощью внедрения общего времени выполнения (runtime), которое будет доступно для всего инструментария: СОМ+.

    Фольклор

    Любая технология, распространенная так широко, как СОМ, начинает обрастать фольклором. Ради забавы приведу несколько, возможно, неизвестных вам тезисов. Некоторые из них даже правдивы.

  • Огромное множество людей из различных групп по всей фирме Microsoft внесли серьезный вклад в разработку СОМ, но главными архитекторами СОМ были Боб Аткинсон (Bob Atkinson), Тони Вильямс (Tony Williams) и Крейг Виттенберг (Craig Wittenberg). Все трое по-прежнему в Microsoft за работой над воистину редкостной чепухой.
  • Боб, Тони и Крейг были частью кросс-группы, получившей привилегию создания базовой технологии, которая позволила бы воплотить в жизнь мечту Билла Гейтса о IAYF (Information at Your Fingertips — информация на кончиках ваших пальцев)4. Но хотя эти трое прекрасно осознавали грядущую мощь СОМ, на деле они были обременены выпуском того, что лишь использовало СОМ: OLE 2.0. Это помогает объяснить, почему оформление документации для собственно СОМ заняло столько времени. Жаль.
  • Первая реализация СОМ была выпущена в свет как часть программного продукта OLE 2.0 в мае 1993 года.
  • Корневой интерфейс (тогда он еще не назывался IUnknown) имел в своем составе метод GetClassID. Тот факт, что он был перемещен в IPersist, иллюстрирует принцип поддерживать модель СОМ настолько простой, насколько это возможно.
  • В одно время IUnknown не имел метода AddRef. В дальнейшем стало ясно, что запрещение копирования указателей интерфейсов — слишком жесткое ограничение для пользователей.
  • «Unknown» в «IUnknown» возник как результат создания Тони Вильямсом в декабре 1988 года внутреннего документа фирмы Microsoft под названием Object Architecture: Dealing with the Unknown—or—Type Safety in a Dynamically Extensible Class Library (Архитектура объектов: борьба с неизвестным — или — безопасность типов в динамически расширяемой библиотеке классов).
  • Решение использовать RPC в качестве механизма межпроцессорного управления (interprocess remoting mechanism) было принято в первые два месяца 1991 года. Служебная записка Боба Аткинсона, озаглавленная IAYF Requirements for RPC (Технические требования IAYF для RPC), документирует требования, предъявленные команде создателей RPC теми, кого впоследствии назвали «командой IAYF». Эта команда отвечала за создание основы того, что осуществило бы мечту Билла Гейтса об «Information at Your Fingertips». Этой основой и была СОМ (хотя тогда она еще так не называлась).
  • Моникеры (monikers) намного мощнее, чем вы думаете.
  • Это Марк Райланд (Mark Ryland) виноват в том, что некоторые расшифровывают аббревиатуру СОМ как «Common Object Model» (модель общих объектов). Он глубоко сожалеет об этом и рассыпается в извинениях.
  • «MEOW» (мяу) в действительности не является сокращением Microsoft Extensible Object Wire (наращиваемый провод для объектов Microsoft). Это шутка Рика (Rick).
  • Windows NT 3.5 включали в себя первые версии 32-разрядных СОМ и OLE. Кто-то случайно оставил «#pragma optimization off» в одном из основных заголовочных файлов. Упс! (Oops).
  • Нет ни одной книги (на английском) о СОМ, DCOM, OLE или ActiveX, которую бы я не прочитал. Вы, вероятно, найдете мое имя в качестве технического обозревателя в списке разработчиков. Я также сам написал множество статей об этих технологиях, и был первым издателем СОМ Specification (Спецификация СОМ). Я провел сотни презентаций СОМ для технических и нетехнических аудиторий. Из всего этого должно быть ясно, что я потратил огромное количество времени и энергии, чтобы найти наилучший способ объяснить, что такое СОМ.

    А теперь, похоже, весь мой тяжкий труд пропал даром, поскольку после прочтения последнего чернового варианта этой книги мне стало ясно, что никто не объясняет СОМ лучше, чем Дон Бокс.

    Надеюсь, что вы насладитесь этой прогулкой в той же мере, как и я.

    Чарли Киндел (Charlie Kindel)
    СОМовец (СОМ guy), корпорация Microsoft
    Сентябрь 1997 г.


    1 Исследование Гиги (Giga), порученное ему фирмой Microsoft, показывает, что в 1997 году рынок коммерческих компонентов, основанных на СОМ, составил 410 миллионов долларов. Ожидается, что этот рынок к 2001 году превысит 2.8 миллиарда долларов. Эти цифры не включают продукцию Microsoft.

    2 Упражнение для читателя: назовите одну коммерчески доступную объектную систему, кроме СОМ, которая предусматривает двоичное повторное использование, поддерживает жесткое управление версиями, прозрачность адресации и независимость от языка программирования. Если вы скажете: «CORBA», — то вас надули и вы не знаете такой объектной системы.

    3 Выдержки из The American Heritage Dictionary of the English Language, Third Edition © 1996 by Houghton Mifflin Company. Электронная версия лицензирована INSO Corporation; дальнейшее копирование и распространение осуществляется в соответствии с законом об авторских правах Соединенных Штатов. Все права защищены.

    4 Вспомните речь Билла о IAYF на конгрессе Comdex-1990.