Вы никогда не хотели изменить свою программу или добавить к ней чтонибудь новое уже после того, как она стала готовым продуктом? Хотели бы Вы разрабатывать свои программы, постепенно расширяя их, а не переписывая заново каждые два года? Хотелось бы Вам, чтобы они проще настраивались? Были более гибкими и динамичными? Вы бы хотели ускорить разработку? А если Вам нужно разрабатывать распределенные приложения — Вы бы хотели писать их так же, как и обычные?
Вы интересуетесь компонентным программированием? Вы хотите разделить свое приложение на компоненты? Вы хотите изучить СОМ? A OLE Автоматизацию? У Вас есть опыт безуспешных попыток изучения OLE? Вы находите, что СОМ и OLE трудны? Хотелось бы Вам понять основы технологий Microsoft, таких как ActiveX, DirectX и OLE? Вам нужно расширять или настраивать приложения или операционные системы Microsoft?
Если хотя бы на один из вопросов Вы ответили «да» — эта книга для Вас! Все эти вопросы связаны с одной технологией: моделью компонентных объектов Microsoft, более известной как СОМ (Component Object Model). Эта книга посвящена разработке ваших собственных компонентов СОМ на C++.
СОМ — это метод разработки программных компонентов, небольших двоичных исполняемых файлов, которые предоставляют необходимые сервисы приложениям, операционным системам и другим компонентам. Разработка компонента СОМ подобна разработке динамического объектноориентированного API. Компоненты СОМ объединяются друг с другом для Гоздания приложений или систем компонентов. Компоненты можно отключать и менять во время выполнения, без перекомпиляции или перекомпоновки приложения. СОМ — это основа, на которой построены такие технологии Microsoft, как ActiveX, DirectX и OLE. Разработчики Microsoft используют компоненты СОМ при разработке своих приложений и операционных систем.
Эта книга рассчитана на обычного программиста на C++, имеющего некоторый опыт разработки для Win32. Но даже если Вы только начинаете использовать C++, пугаться не следует. Разрабатывать компоненты СОМ на C++ несложно, и мастерского владения языком не требуется. Самый «продвинутый» элемент C++, используемый в книге, — множественное наследование, и вся информация об этой концепции, необходимая для работы с СОМ, здесь представлена. Кстати, положительный побочный эффект для новичков состоит в том, что СОМ «подталкивает» к хорошему проектированию программ. Но, конечно, начинающим будет полезно познакомиться с книгами, специально посвященными изучению C++.
Опыт программирования для Microsoft Windows также полезен, но не обязателен. Я пытался максимально избегать кода, специфичного для Windows. У пользователей UNIX не должно возникнуть проблем при чтении примеров. Преимущество программистов для Windows лишь в том, что они знакомы с инструментами разработки Windows-приложений.
Знание Microsoft Foundation Class Library (MFC) и опыт работы с этой библиотекой не обязательны. MFC не дает никаких особых преимуществ при разработке компонентов СОМ, так что в примерах из первых 12 глав книги она вообще не используется.
Если Вы пишете программы для UNIX, Macintosh, Linux, VMS или какой-либо другой операционной системы, эта книга также будет Вам полезна. Концепции, заключенные в СОМ, работают не только в операционной системе Microsoft Windows. СОМ — это не большой API. СОМ — это способ программирования, стоящий в одном ряду с такими способами, как структурное или объектно-ориентированное программирование. Вы можете использовать подход СОМ в любой операционной системе. Конечно, Windows предоставляет код, который облегчает программирование «в духе СОМ», но большую часть этого кода нетрудно реализовать на Вашей любимой платформе. Если Вы не хотите делать это сами — не беда. Microsoft разрабатывает версию СОМ для Macintosh, a Software AG занимается переносом СОМ практически на все операционные системы в мире. Так что скоро Вы сможете воспользоваться преимуществами стандартной и совместимой версии СОМ в любой операционной системе, с которой придется столкнуться.
Хотя сама по себе СОМ не зависит от языка программирования, для написания компонентов придется выбрать определенный язык. Годится практически любой, от С и Java до Python и Microsoft Visual Basic. Однако большинство компонентов разработано и будет разрабатываться на C++. В связи с этим в книге используется исключительно C++. Применение одного языка позволило мне представить спецификацию СОМ наиболее конкретно, что облегчает восприятие. Даже если Вы в конце концов решите использовать Java или Python, знания, полученные при разработке компонентов «с нуля» на C++, помогут Вам.
Поскольку не все компиляторы поддерживают последние расширения C++, я старался не употреблять большинство новых возможностей. Не используются ключевые слова bool, mutable и им подобные. За исключением классов smart-указателей на интерфейсы (гл. 9), я не использую шаблоны классов, так как они затрудняют понимание изложенных в книге концепций.
Тем не менее будут использоваться относительно новые операторы приведения типов static_cast, const_cast и reinjterpret_cast, так как они уже более года поддерживаются Microsoft Visual C++. Приведения типов нового стиля заменяют старые. Таким образом, вместо
CFoo* pi = (CFoo*)this;
Вы увидите:
CFoo* pi = static_cast
В некоторых случаях я по-прежнему использую старые приведения типов, так как они легче читаются.
Каждая глава этой книги включает один или два примера. Моей целью при написании этих примеров было сделать их сжатыми, но законченными. Короткие примеры проще читать — они занимают лишь пару страниц. Более длинные примеры потребовали бы чтения файлов с прилагаемого к книге компакт-диска. Кроме того, простые примеры лучше подчеркивают требования, предъявляемые к компонентам СОМ, не заставляя Вас продираться сквозь несущественные детали и сложности, присущие длинным примерам.
Для всех примеров характерно следующее:
На прилагаемом компакт-диске имеется полностью готовое приложение, построенное из компонентов СОМ. Это приложение, Tangram, нарушает большую часть из перечисленных выше правил. Во-первых, оно не только интенсивно обращается к API Win32, особенно GDI, но и использует MFC и OpenGL. Во-вторых, его нельзя назвать простым. Оно содержит много компонентов в нескольких DLL и ЕХЕ. Программа Tangram показывает, как выглядит СОМ «в реальном мире», тогда как другие примеры имеют
скорее «школьный» характер. На компакт-диске содержатся как исходные тексты, так и компилированный исполняемый код.
Хотя в большинстве примеров MFC не используется, я тем не менее использую стиль кодирования MFC. Имена всех переменных-членов имеют префикс m_. Увидев переменную с именем m_SleepyBear, Вы будете знать, что это за переменная. Все имена классов начинаются с заглавной буквы С. Например, ССоzyВеаг— это имя класса Cozy Bear.
Если Вы программировали под Windows, то, вероятно, знаете о Венгерской нотации. Она представляет собой соглашение, по которому в имена переменных входит информация об их типах. Но я не всегда
строго ему следую, поскольку частично использую и подмножество Венгерской нотации, рекомендованное другими разработчиками СОМ, OLE и ActiveX.
Изучали ли Вы физику в школе? Если Вам преподавали физику, пользуясь элементами высшей математики, то знание последних было необходимым предварительным требованием. Изучая математический анализ, Вы учились применять его в разных областях. Только изучив и поняв дифференциальное исчисление как таковое, Вы смогли использовать его для решения физических задач. Такая последовательность обучения существовала не всегда. Сначала Исаак Ньютон изобрел дифференциальное исчисление как инструмент классической механики и динамики. Только позднее стало
ясно, что этот мощный инструмент имеет приложения и за границами физики.
Связь между СОМ и OLE во многом похожа на связь высшей математики с физикой. Как дифференциальное исчисление было изобретено для решения физических задач, так и модель СОМ была разработана для решения проблемы «внедрения» электронной таблицы в текстовый редактор. Решение этой проблемы стало известно под именем OLE. Есть множество книг по OLE, но не по СОМ. Первая, лучшая и наиболее полная книга по OLE — книга Крейга Брокшмидта Inside OLE.
Когда Крейг писал эту книгу, у СОМ была только одна область применения, а именно OLE. Всякий, изучавший СОМ, на самом деле собирался изучать OLE. To, что две концепции смешивались, не имело значения. Это очень похоже на первые дни дифференциального исчисления. Вы не стали бы его осваивать, если бы не собирались заниматься физикой.
Теперь СОМ присутствует повсюду, и достаточно очевидно, что СОМ важнее OLE. На сегодняшний день у Microsoft есть множество СОМ интерфейсов и компонентов, которые не имеют отношения к OLE. Один из примеров — DirectSD, API Microsoft для программирования трехмерной графики. Когда Найджел Томпсон писал свою книгу 3D Graphics Programming for Windows 95, ему пришлось включить в нее главу, посвященную использованию СОМ. Это выглядит так, как если бы профессор физики давал пятнадцатиминутный обзор дифференциального исчисления, прежде чем погрузиться в свой предмет. В результате студенты не поймут физики, а будут слепо заучивать уравнения.
Задача этой книги — отделить СОМ от OLE и уделить первой то внимние, которого она заслуживает. Я вообще не собираюсь обсуждать в этo книге OLE. Я хочу рассмотреть базовые механизмы СОМ. После того, как Вы изучите эти механизмы, их можно будет применить к разработке компонентов OLE, DirectX и ActiveX, подобно тому как дифференциально исчисление позволяет решать отнюдь не только проблемы физики.
Итак, если Вы хотите действительно понимать механизмы создания компонентов СОМ, то эта книга для Вас. Полученные знания Вы сможете применить при создании компонентов ActiveX, OLE или своих собственных. Будущее — это СОМ, и эта книга — Ваш ключ к будущему. (В худшем случае она поможет Вам более эффективно использовать множественное наследование в C++.)
Мы приложили максимум усилий, чтобы эта книга и содержимое прилагаемого к ней компакт-диска были точными и правильными. Microsoft Press предоставляет исправления к своим книгам через World Wide Web по адресу:
http://www.microsoft.com/mspress/support/
Если у Вас есть комментарии, вопросы или идеи относительно этой книги или прилагаемого компакт-диска, посылайте их в Microsoft Press любым из описанных ниже способов:
По почте
Microsoft Press
Attn: Inside CQM Editor
One Microsoft Way
Redmond, WA 98052-6399
E-mail
MSPINPUT@MICROSOFT.COM
Пожалуйста, обратите внимание, что поддержка программных продуктов по данным адресам не оказывается. Если такая поддержка Вам нужна, то ниже приведены несколько источников, которое могут оказаться полезными.
Я рекомендую Web-узел Microsoft Developer Network (MSDN), который находится по адресу:
http://www.microsoft.com/MSDN/
Для того чтобы воспользоваться всеми возможностями MSDN, подпишитесь на соответствующий сервис. Информацию о подписке можно получить на указанном выше узле или по телефону (800) 759-5474.
Microsoft также предоставляет большой объем информации о поддержке программных продуктов (включая перечень известных проблем и исправление ошибок) по следующему адресу:
http://www.microsoft.com/support/
По вопросам, относящимся конкретно к СОМ, обращайтесь к персоналу Microsoft Win32 SDK AnswerPoint. Звоните по телефону (800) 936-5800, Priority Developer line.
По вопросам, связанным с Microsoft Visual C++, обращайтесь по обычной линии поддержки по телефону (206) 635-7007 в рабочие дни с 6 утра до 6 вечера (Pacific time).
Примеры
Пример программы Танграм
Стилистические соглашения
Почему появилась эта книга?
Техническая поддержка