developing.ru - клуб программистов Здесь может быть и ваша реклама.
developing.ru >технология COM >
Михаил Безверхов
aspid@developing.ru

Скажите, все ли письма телезрителей вы придумываете сами?

В этой статье мы должны были бы рассмотреть что такое интерфейс с точки зрения его реализации в computer sciences. Сегодня в тексте должны бы были появиться пусть пока небольшие, но уже фрагменты кода. Но "в редакцию пришли письма". В них авторы называют меня разными хорошими словами (оставим это на их совести, возможно, они просто пока до конца ещё не разобрались :-) и задают несколько важных вопросов:

  • Если наше изложение - практическое введение, то на каких языках программирования будут приводиться примеры?
  • Какие технические средства и инструменты будут использоваться?
  • По COM/OLE существуют книжки. Что это за книжки и которые из них можно рекомендовать для самостоятельного изучения COM?
  • Чем серия статей данного автора будет отличаться от тех самых книжек?

Поскольку сформулированные вопросы - мои упущения в изложении, то в этой стетье я постараюсь исправиться. Так, наверное, нужно делать и дальше - как только вопросов накапливается на самостоятельный выпуск, на них нужно ответить. В общем, я предлагаю такой механизм обратной связи. Вы, безусловно, можете присылать свои вопросы и предложения мне, мой адрес - aspid@developing.ru Эти вопросы и предложения будут влиять на дальнейшее изложение, возможно, и не в виде конкретного ответа на конкретный вопрос - плавность повествования тоже забывать нельзя. Если же вы хотите получить конкретный ответ на конкретный вопрос, то на сайте http://www.developing.ru открыт Форум, на котором вы можете его сформулировать. Форум требует регистрации, и на нём "тусуется" целая группа программистов. Наша "группа профессиональных программистов" будет рада, если вы к нам присоединитесь и поможете нам отвечать на вопросы, или, наоборот, их задавать.

Начнём с ответа на первый вопрос - про языки программирования. COM - двоичная технология, т.е. всё равно на каком языке написаны клиент и сервер. Но действительно существуют предпочтения в отношении языков, на которых они на самом деле пишутся. И "средневзвешенная норма" выглядит здесь следующим образом. COM-серверы, преимущественно, пишутся на языках C и C++. Дело в том, что С и C++ - пожалуй, единственные языки, которые прямо и эффективно транслируются в машинные команды. "Машинно-эффективнее", чем C/C++ может быть только Ассемблер, но на Ассемблере невозможно писать большие программы и область его применения совсем другая.

На C/C++ труднее писать программы, чем на VB или Java, но COM - технология, предназначенная для повторного использования кода, т.е. эффективность реализации сервера, пусть даже ценой бОльших затрат программиста - оправданна в полном цикле "создание - использование". Ведь "написано однажды - работает везде". А на C/C++ программист в самом буквальном смысле слова может делать всё и очень коротко. Так как основные трудности и проблемы COM находятся на стороне сервера, а не клиента, то и возможность C/C++ закодировать всё, что угодно оказывается весьма полезной. Более того, проектные абстракции C++ прямо отображаются в абстракции COM, поэтому программист может мыслить в одной системе понятий - для него конструкции COM будут просто специализациями конструкций C++. Для нас в методическом плане это обстоятельство исключительно важно - практически всю "анатомию COM" мы сможем изложить не выходя за рамки C++ и не плодя сущностей сверх меры.

Сказанное не означает невозможности реализовать COM-сервер с использованием других средств. Например, современный VB позволяет создать проект, который будет являться COM-сервером. Это можно сделать быстро и просто, собственно, ничего "от самого COM" программист и не увидит, а сервер действительно будет работать. Но машинная эффективность такого сервера будет невелика, а размер - огромен. Поэтому для индустриального производства COM-компонент такой подход не применяется, хотя в конкретном частном стечении обстоятельств вполне может быть использован. Случай Delphi, как VB-подобного инструмента, но - с настоящей компиляцией кода, является очень приятным исключением, которое, к сожалению, только подтверждает правило.

COM-клиенты, напротив, преимущественно пишутся на VB и скриптовых языках, наподобие VBScript. Конструкция COM-клиента - намного проще конструкции COM-сервера и в "общую неэффективность COM" клиент вносит весьма скромный вклад. Поэтому при разработке клиента важным обычно является скорость самой разработки. Это тоже соотносится с общей идеей - повторное использование кода клиента значительно менее распространено, чем повторное использование кода сервера.

И опять - сказанное не означает, что COM-клиент невозможно написать на C++. Можно, хотя, по сравнению с написанием его на VB это - ещё то удовольствие. Но в конкретном стечении обстоятельств, когда вам, скажем, требуется какая-то предельная вычислительная эффективность клиента (сортировка, поиск и т.д.) и в нем есть один-два вызова COM-объектов, вы, конечно, закодируете эти вызовы на C++ - эффективность остальной части клиента будет важнее.

В целом же, серверы обычно пишутся на C++, а клиенты - на VB. При выборе своего проектного решения об этом стоит помнить. Поэтому для нашей рассылки рабочими языками примеров будут C/C++ и VB/VBA. Уметь на них программировать - весьма желательно; если вы хотите быть профессиональным COM-программистом - совершенно необходимо, но для понимания нашего изложения качество владения языком программирования не очень существенно.

Какие технические средства и инструменты будут использоваться? Для С++ и VB - Microsoft Visual Studio 6.0a, как самый распространенный в этом деле инструмент. [Сейчас, по прошествии трёх лет с момента первоначального написания этих строк я не откажусь использовать и Microsoft Development Environment 7 - язык C++ в любом случае является стандартом ISO] Это не означает, что примеры не могут быть реализованы с использованием других компиляторов, просто готовые проекты примеров будут сделаны именно в этом средстве. Естественно, что мы будем пользоваться и утилитами, входящими в комплект поставки Visual Studio. В качестве носителя VBA мы будем использовать Microsoft Excel - тоже достаточно распространенную программу.

В отношении же среды исполнения можно сказать следующее. Технология COM (тогда ещё называвшаяся OLE) была отлажена еще в Windows 3.1. И, будучи включенной в Windows 95, уже была свободной от ошибок в достаточной степени. Все дальнейшие операционные системы с платформой Win32 имеют встроенные средства поддержки COM хорошей степени отлаженности, и, главное, спецификация COM на них - в точности одна и та же. Поэтому ожидается, что примеры COM будут работать одинаково во всех операционных системах Microsoft, начиная от Windows 95OSR2. Впрочем, за Windows CE я поручиться не берусь, потому, что ни разу для нее компонентов не писал. Кроме того, ошибки операционной системы в уровне поддержки COM маловероятны еще и потому, что сама операционная система - компонентное изделие. В этом можно убедиться, заглянув в системный реестр в раздел HKCR\CLSID сразу после инсталляции только системы, до инсталляции всех других программ. CLSIDs, экспонируемых самой системой, там более, чем достаточно.

Какие существуют книги по COM/OLE и вообще, какие могут быть ещё источники информации? Я начинал изучение OLE в далёком теперь уже 1995 году по книге "OLE за 21 день", к сожалению, уже не помню сейчас её автора. Других книг на русском языке в то время не было, а эта книга доставила мне в высшей степени сумбурные представления. Во всяком случае, научиться по ней написать хотя бы один, но полностью свой, работающий объект я не смог. Основным источником информации для меня выступила Сеть и собственная работа.

Сейчас положение изменилось - с тех пор выпущена не одна хорошая книга. Лучшей я считаю книгу Дейла Роджерсона "Основы COM" - более толковой книги я не видел, во всяком случае в ней я нашел ответы на очень многие вопросы, которые у меня были. Неплохой для тех, кто пишет свои программы на C++, является и книга Эндрю Трельсена "Модель COM и применение ATL 3.0". Ну а классика жанра, конечно, книга Крейга Брукшмидта Inside OLE. В английском варианте она полностью входит в MSDN.

В собственной практике важным источником информации о том, как работает COM для меня явились исходные тексты ATL 1.1 - набора шаблонных классов, который тогда только-только разработала Microsoft для облегчения тяжкой жизни программиста COM. Читая Дейла Роджерсона я вручную пытался специализировать шаблоны и изучал как реализуются те или иные конструкции COM. Лучшего примера кода я привести не могу! Сейчас ATL существует уже в третьей версии, так что примеров продвинутого кода, вполне могущего считаться "каноническим" только прибавилось.

Чем изложение будет отличаться от книг? Сам я считаю, что дефектом многих существующих учебников по технологиям программирования (это относится не только к COM, но и вообще к любой технологии излагаемой в современных учебниках) является то, что они начинаются "сверху" - "вызовите Wizard, отметьте в нём... поставьте... Wizard сгенерировал вам код...". Но в учебнике очень невнятно объясняется, почему Wizard сгенерировал именно такой код! Что означают те или иные макросы по ходу текста, как выглядит и сам протокол к которому Wizard строит реализацию. Словом, современные учебники пытаются обучить сложению используя в качестве наглядного пособия калькулятор - а как калькулятор выполняет сложение учебник не объясняет. С моей точки зрения это - тяжелейший порок, поскольку квалификация программиста определяется прежде всего пониманием философии, основ, концепций. Писать реально работающие программы, конечно, нужно с применением соответствующих инструментов. Писать вручную - анахронизм, часто выдающий дремучесть программиста. Но и владея распрекрасным инструментом всё равно нужно знать, как работает механизм, потому, что в какой-то момент времени может обнаружиться ошибка в самом инструменте, произойти несчастливое стечение обстоятельств и параметров, а тогда программист должен суметь, пользуясь своим общим знанием, отыскать то самое место, в котором возникает ошибка и исправить её.

Конечно, и COM имеет такие инструменты. Самых известных два - MFC и ATL. При умелом использовании они здорово облегчают жизнь. Но мы пока не будем ими пользоваться никак. Наша ближайшая задача несколько иная - понять, как функционирует COM на уровне конструкций своей программы и вызовов операционной системы. Весь код первого, самого примитивного, примера будет написан "руками на голом C++" с одной-единственной целью - понять и откомментировать каждую деталь, которую он реализует. В дальнейшем мы двинемся в двух направлениях - мы будем усложнять наш первый примитивный пример вводя в него всё новые конструкции, соответствующие нашему продвижению вперёд, и мы будем переписывать наш пример с использованием инструментальных средств, т.е. мы будем одновременно выяснять какие конструкции COM в себе инкапсулируют стандартные средства и как именно.

Я должен заметить, что так мне казалось в момент первоначального написания этих строк. По ходу сочинения серии выяснилось, что первое обстоятельство - демонстрация глубинных механизмов COM, не заслоненных артефактами конкретной их реализации инструментальнрыми средствами, значит для нашей аудитории значительно больше, чем объяснение, "как это сделано в ATL". Более того, даже рассмотрение устройства самого ATL как "инженерной реализации" системы программирования является самостоятельной и очень большой темой. Которую едва ли можно будет полноценно охватить именно в данной серии статей.

Кроме того - написание программ в компонентной модели не есть просто приделывание к готовой программе дополнительного служебного кода COM и только. "Компонентность" влияет на саму архитектуру модуля. Как и в каких случаях - это тоже тема нашего изложения.

В любом случае, я прошу не полагаться как на источник знания только на мои статьи. Читайте другую литературу по COM, сопоставляйте, ищите противоречия и неясные места. Задавайте вопросы автору. И здесь я должен заметить - серия стяжала себе вполне определённую репутацию как, прежде всего, "источник философии". Не могу делать выводов о причинах этого, но вопросов "какую запятую мне вставить в таком-то месте моей программы" я практически и не получил. Видимо, ответ на вопрос "что конкретно" отыскивается нашими читателями несопоставимо проще, чем ответ на вопросы "зачем" и "почему было сделано именно так". И хотя я давно уже выполняю программистскую работу несопоставимо более высокого уровня, чем простое написание программ с использованием COM, "мастерство не пропьёшь" - придётся следовать в уже сложившемся русле читательских предпочтений:)

А "Откуда суть пошли интерфейсы программные" мы рассмотрим в следующий раз...

предыдущий выпускархив и оглавлениеследующий выпуск
Авторские права © 2001 - 2004, Михаил Безверхов
Публикация требует разрешения автора

разделы сайта

форум

технология COM

оптимизация сайтов


© 2000-2004 Клуб программистов developing.ru