Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5_TKP_PrCOM.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
556 Кб
Скачать
☆

5.6 Методические указания.

Основные понятия технологии COM, являющейся базовой технологией операционных систем Windows, были рассмотрены в рамках выполнения II учебной практики [11]. Там же отмечалось, что с точки зрения разработчика, возможны два класса задач, связанных с использованием технологии COM:

  • применение уже имеющихся COM-объектов;

  • создание собственных COM-объектов.

Задачи первого класса значительно проще, ибо применение уже имеющихся COM-объектов, по сути, мало чем отличается от работы с обычными объектами. Поскольку в состав самой Windows входят многочисленные COM-объекты, а многие приложения имеют хорошо документированные соответствующие иерархии (коллекции) COM-объектов (объектные модели), то создание таких приложений обычно не представляет особых трудностей. В процессе выполнения II учебной практики Вы познакомились с использованием готовых COM-объектов, базирующихся на технологии OLE Automation (широко применяется в рамках пакета Microsoft Office) и технологии ActiveX (позволяет создавать и использовать программные компоненты, предоставляющие различные сервисы другим приложениям и операционной системе).

Второй же класс задач более сложен и требует от разработчика достаточно глубокого знакомства с технологией COM и ее компонентами. Именно эти вопросы и будут рассмотрены в рамках этого курса.

5.6.1 Основные сведения о сом-объектах

Т ехнология СОМ работает с, так называемыми, СОМ-объектами. СОМ-объекты похожи на обычные "классические" объекты использующиеся в современном программировании, однако отличаются от них тем, что во-первых, вдобавок ко всем обычным свойствам имеет идентификатор класса (CLSID), а во-вторых - это полностью закрытые данные, которые могут быть получены только через некую функцию-метод. Набор таких методов, позволяющий работать с данными объекта, носит название интерфейса. Согласно венгерской нотации, имена всех интерфейсов начинаются с буквы I (lUnknown, Idispatch и т. п.). Клиенты могут получить доступ к сервисам объекта СОМ только через вызовы методов интерфейсов объекта - у них нет непосредственного доступа к данным объекта. Обычный СОМ-объект включает в себя один или несколько интерфейсов. Каждый из этих интерфейсов имеет собственный указатель. Кроме того, объекты COM поддерживают наследование, лишь на уровне интерфейсов. Другими словами, сами СОМ-объекты не наследуются, но можно наследовать их интерфейсы. Наследование интерфейса означает передачу только объявления методов, их программный код потомок должен предоставить самостоятельно. Более подробно структура и обозначение СОМ-объекта были рассмотрены в [11].

COM-объект не может существовать независимо. Он может быть реализован только сервером объектов COM. На рис 5.1 показан объект COM. Он всегда реализуется внутри некоторого сервера (прямоугольник вокруг объекта). Сервер отвечает за создание, существование и уничтожение своих объектов COM. Каждый COM-объект "живет" в адресном пространстве своего сервера. Сервер может быть либо динамически подключаемой библиотекой (DDL), подгружаемой во время работы приложения, либо отдельным самостоятельным процессом (EXE-файл).

Что бы вызвать методы интерфейса COM, клиент должен получить указатель на этот интерфейс. Обычно COM-объект предоставляет свои сервисы посредством нескольких интерфейсов, и клиенту требуется отдельный указатель для каждого интерфейса, методы которого он намерен вызывать.

Фундаментальный интерфейс. Все интерфейсы строятся (наследуются) от базового интерфейса, который называется lUnknown ("неизвестный"). Несмотря на такое название, это единственный интерфейс, о котором знают все клиенты и компоненты. А такое название объясняется тем, что поскольку все интерфейсы COM являются его наследниками, то при наличии у клиента указателя на lUnknown, он может запросить через него другие интерфейсы даже в том случае, если он не знает указателями на какой именно интерфейс обладает данный объект. Любой COM-объект всегда содержит интерфейс IUnknown. При создании COM-объекта чаще всего возвращается ссылка именно на этот интерфейс. Этот интерфейс содержит всего три метода:

- QueryInterface - посредством этого метода можно получить ссылку на любой другой интерфейс объекта. При вызове этого метода автоматически выполняется так же метод AddRef.

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

- Release - уменьшает счетчики ссылок внутри COM-объекта и сервера. Этот метод вызывается клиентами каждый раз, когда ссылка на какой-нибудь интерфейс больше не нужна. При достижении нуля счетчиком ссылок COM-объекта этот объект перестает существовать, а при достижении нуля счетчиком ссылок сервера он (как правило) полностью выгружается, освобождая ресурсы системы.

О дин интерфейс может быть предком для нескольких других интерфейсов. При этом создается как бы дерево наследования, но корнем этого дерева всегда является интерфейс IUnknown. Так как он является предком всех интерфейсов, то все интерфейсы содержат указанные выше три метода, и, следовательно, имея ссылку на любой интерфейс COM-объекта можно получить ссылку на любой другой интерфейс этого же объекта (рис 5.2).

Н

после своего создания и опубликования интерфейс объекта больше никогда и ни при каких обстоятельствах не может быть изменен.

еизменность интерфейсов. В создании COM-объектов есть одно "железное" правило, соблюдать которое обязан каждый программист, создающий и, главное, поддерживающий свой объект COM:

Это правило связано, отчасти, с тем, что к моменту модификации вашего объекта уже, возможно, будут существовать десятки или даже сотни (если повезет) приложений-клиентов, использующих этот объект со старыми интерфейсами. Естественно так же не должен меняться IID существующих интерфейсов. Если Вы создадите новый объект, изменив старые интерфейсы, то, приложения-клиенты, не смогут обнаружить доступные им интерфейсы, а следовательно – станут неработоспособными.

Для того, что бы создать новую версию объекта, необходимо, оставив старый интерфейс, дополнить объект новым интерфейсом с дополнительными методами. Допустим, если есть некий интерфейс IMyInterface, то можно создать новый интерфейс IMyInterface2 путем наследования IMyInterface и добавления к нему новых методов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]