ebook img

Основы COM PDF

228 Pages·2000·2.289 MB·Russian
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Основы COM

Основы 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 От автора К огда я учился в Технологическом институте Джорджии, мои однокурсники часто шутили насчет той известности, которую им приносили (или, точнее, не приносили) технические статьи. Обычно эти статьи подписывали три автора. Первым шел профессор — руководитель студента. Сразу за ним следовал еще один профессор. Этот второй, иронизировали мы, не имел к статье абсолютно никакого отношения, но ему нужны были печатные работы («публикуйся или пропадешь»). Фамилия же скромного дипломника, который и проделал всю работу, шла последней, как бы между прочим. В отличие от тех статей, на обложке этой книги значится только одно имя — мое. Однако книга не могла бы появиться без помощи множества людей. Их имена также заслуживают того, чтобы стоять в самом начале. Без Найджела Томпсона (Nigel Tompson) я бы и не начал писать. Найджел видел, что разработчикам нужна понятная книга про COM, — и подвигнул меня на ее написание. Похвальные отзывы Нэнси Клатс (Nancy Cluts) вдохновляли меня в особенно трудных местах, когда я мучительно подбирал слова. Если же я подбирал не те слова, Найджел и Нэнси говорили об этом прямо и честно, и я старался улучшить текст. Крейг Брокшмидт (Kraig Brockshmidt) и Крейг Виттенберг (Craig Wittenberg) задали основные направления работы в начальной стадии написания книги. Кроме того, они подбадривали меня и делали важные технические замечания. Хотя пишут книгу обычно в одиночку, над ее выпуском работает целая команда; по счастью, у этой книги была фантастическая команда. Многие в Microsoft Press не видели необходимости в книге, посвященной исключительно COM, но Эрик Строо (Eric Stroo) убедил их ее издать. Кэтлин Эткинс (Kathleen Atkins) проделала изумительную работу в качестве основного редактора. Она руководила всем проектом и правила текст. Мало того, она еще и делала фотографии и рисунки, с которых начинается каждая глава. Пэм Нидака (Pam Nidaka) разработала по-настоящему крутой дизайн, а Майкл Виктор (Michael Victor) — столь же замечательные графические эффекты, включая танграм* для фотографий. Технический редактор Гэри Нельсон (Gary Nelson) проделал работу, далеко выходящую за пределы его прямых обязанностей, проверяя все технические детали, сколь бы мудреными и запутанными они ни были. Шон Пек (Shawn Peck) возглавлял многочисленную и деятельную группу корректоров, успешно отыскивавших те ошибки, которые не попались на глаза Кэтлин и Гэри. Кроме того, я в долгу перед всеми, кто читал и просматривал ранние сырые варианты. Это Мэри Кэртланд (Mary Kirtland), Марк Крамер (Mark Kramer), Джон Торнсон (John Thornson), Тим Брэгг (Tim Bragg), Вину Чериан (Vinoo Cherian), Чарли Киндел (Charlie Kindel), Джерри Нолл (Jerry Noll) и Кирк Годдард (Kirk Goddard). Конечно, я должен поблагодарить моих товарищей в Microsoft Developer Studio, которые отпускали меня на выходные домой, работать над книгой. Особенно я благодарен Мартину Ловеллу (Martin Lovell) за ценнейшие обсуждения технических вопросов. Я не смог бы написать эту книгу, если бы не опыт, полученный в Microsoft Developer Network. В MSDN я понял, как важно иметь хорошего редактора; у меня был один из лучших — Хандан Селамоглу (Handan Selamoglu). Хандан была настоящим тренером, подготовившим меня к работе со всеми последующими редакторами. Наконец, я должен поблагодарить моих друзей и семью, всегда много значивших в моей жизни. Простите меня, Питер Ланкастер (Peter Lancaster) и Пол Шустер (Paul Schuster), за то, что в этом году я не пошел с вами на байдарках, поскольку был занят книгой. Эй, ребята, следующий год наш! Спасибо моей сестре за то, что всегда была рядом. Спасибо моим родителям за то, что они купили мне первый компьютер, Radio Shack TRS-80. И спасибо Саре, которая целый год провела с диким медведем вместо человека. * Прим. перев.: Танграм — китайская геометрическая головоломка.

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.